栈
- 定义:只允许在一端进行插入或删除操作的线性表(LIFO)
- 重要术语:栈顶、栈底、空栈
- 特点:先进后出

#define MaxSize 10
typedef struct{
int data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack &S){
S.top = -1;
}
bool Push(SqStack &S, int x){
if(S.top == MaxSize-1)
return false;
S.top = S.top +1 ;
S.data[S.top] = x;
}
bool Pop(SqStack &S, int &x){
if(S.top == -1)
return false;
x = S.data[S.top];
S.top = S.top -1;
return true;
}
#define MaxSize 10
typedef struct{
int data[MaxSize];
int top0;
int top1;
}ShStack;
void InitStack(ShStack &S){
S.top0 = -1;
S.top1 = MaxSize;
}


队列
定义:只允许在一端进行插入,在另一端删除的线性表(FIFO)
术语:队头、队尾、空队列

#define MaxSize 10
typedef struct{
int data[MaxSize];
int front,rear;
} SqQueue;
void InitQueue(SqQueue &S){
S.rear = S.front = 0;
}
bool QueueEmpty(SqQueue Q){
if(Q.front == Q.rear) return true;
else return false;
}
bool EnQueue(SqQueue &Q, int x){
if((Q.rear + 1) % MaxSize == Q.front)
return false;
Q.data[Q.rear] = x;
Q.rear = (Q.rear +1) % MaxSize;
return true;
}
bool DeQueue(SqQueue &Q, int &x){
if(Q.rear == Q.front)
return false;
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return true;
}
bool GetHead(SqQueue Q, int &x){
if(Q.rear == Q.front)
return false;
x = Q.data[Q.front];
(Q.rear + MaxSize-Q.front) % MaxSize
return true;
}

链式队列

//---------队列的链式实现
typedef struct LinkNode{ // 链式队列结点
int data
struct LinkNode *next
}LinkNode
typedef struct{//链式队列
LinkNode *front, *rear
}LinkQueue
//初始化队列(带头结点)
void InitQueue(LinkQueue &Q){
//初始时,front, rear都指向头结点
Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode))
Q.front->next = NULL
}
//初始化队列(不带头结点)
void InitQueue2(LinkQueue &Q){
//初始时,front, rear都指向NULL
Q.front = NULL
Q.rear = NULL
}
//判断队列是否为空(带头结点)
bool IsEmpty(LinkQueue Q){
if(Q.front == Q.rear) return true
else return false
}
//判断队列是否为空(不带头结点)
bool IsEmpty2(LinkQueue Q){
if(Q.front == NULL) return true
else return false
}
//新元素入队(带头结点)
void EnQueue(LinkQueue &Q, int x){
LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode))
s->data = x
s->next = NULL
Q.rear->next = s
Q.rear = s
}
//新元素入队(不带头结点)
void EnQueue2(LinkQueue &Q, int x){
LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode))
s->data = x
s->next = NULL
if(Q.front == NULL){
//在空队列中插入第一个元素
Q.front = s
Q.rear = s
} else {
Q.rear->next = s
Q.rear = s
}
}
//队头元素出队(带头结点)
bool DeQueue(LinkQueue &Q, int &x){
if(Q.front == Q.rear) return false
LinkNode *p = Q.front->next
x = p->data
Q.front->next = p->next
if(Q.rear == p) //此次是最后一个结点出队
Q.rear = Q.front
free(p)
return false
}
//队头元素出队(不带头结点)
bool DeQueue2(LinkQueue &Q, int &x){
if(Q.front == NULL) return false
LinkNode *p = Q.front
x = p->data
Q.front = p->next
if(Q.rear == p){//此次是最后一个结点出队
Q.front = NULL
Q.rear = NULL
}
free(p)
return true
}
void test(){
LinkQueue Q
InitQueue(Q)
}
双端队列
定义: 只允许从两端插入,两端删除的线性表


