四、栈和队列
数据结构
①顺序栈
typedef struct
{
ElemType data[MaxSize];
int top;
} SqStack;
②链式栈
typedef struct LinkNode
{
ElemType data;
struct LinkNode * next;
}*LStack;
③顺序队列
typedef struct
{
ElemType data[MaxSize];
int front,rear;
} SqQueue; //循环队列也使用这种存储结构
④链式队列
typedef struct
{
ElemType data;
struct LinkNode *next;
} LinkNode;
typedef struct
{
LinkNode *front,*rear;
} LinkQueue;
1、循环队列的入队 队尾入
int EnQueue(SqQueue & Q,ElemType x)
{
if((Q.read + 1)%MaxSize == Q.front)
return 0;
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1)%MaxSize;
return 1;
}
2、循环队列的出队 队头出
int DeQueue(SqQueue & Q,ElemType &x)
{
if(Q.read == Q.front)
return 0;
x = Q.data[Q.front];
Q.front = (Q.front + 1)%MaxSize;
return 1;
}
3、顺序栈的入栈
bool Push(SqStack & s,ElemType x)
{
if(S.top == MaxSize - 1) return false;
S.data[++S.top] = x;
return true;
}
4、顺序栈的出栈
bool Pop(SqStack &s,ElemType &x)
{
if(S.top == -1) return false;
x = S.data[S.top--];
return true;
}
5、链式栈的入栈
int Push(LStack * s,ElemType x)
{
LStack *p = (LStack*)malloc(sizeof(LStack));
p->data = x;
p->next = s->top; //插入
s->top = p;
}
6、链式栈的出栈
int pop(LStack * s,ElemType &x)
{
LStack *p = (LStack*)malloc(sizeof(LStack));
p = s->top;
x = p->data;
s->top = s->top->next; //脱链
free(p);
}