- 栈:限定仅在表尾进行插入和删除操做的线性表,后进先出的线性表,简称LIFO结构
- 栈顶:表尾,容许插入和删除的一端
- 栈底:表头,不容许插入和删除的一端
- 空栈:不含任何数据元素的栈
typedef int SElemType typedef struct { SElemType data[MAXSIZE]; int top; }SqStack;
Status Push(SqStack *S,SElemType e) { if(S->top==MAXSIZE-1){ //栈满 return ERROR; } S->top++; //栈顶指针增长 S->data[S->top]=e; //将新插入元素赋值给栈顶空间 return OK; }
Status Pop(SqStack *S,SElemType *e) { if(S->top==-1){ return ERROR; } *e=S->data[S->top]; //将要删除的栈顶元素赋值给e S->top--; //栈顶指针减一 return OK; }
一个栈增长,一个栈缩短,当top1+top2==top2时栈满。数组
typedef struck { SElemType data[MAXSIZE]; int top1; int top2; }SqDoubleStack;
Status Push(SqDoubleStack *S,SElemType e,int stackNumber) { if(S->top1+1==S->top2){ //栈已满,不能再push新元素了 return ERROR; } if(stackNumber==1){ //栈 1 有元素进栈 S->data[++S->top1]=e; //如果栈1则先top1+1后给数组元素赋值 } else if(stackNumber==2){ //栈2有元素进栈 S->data[--S->top2]=e; //如果栈2则先top2-1后给数组元素赋值 } return OK; }
Status Pop(SqDoubleStack *S,SElemType *e,int stackNumber) { if(stackNumber==1){ if(S->top1==-1){ return ERROR; //说明栈1已是空栈,溢出 } *e=S->data[S->top1--]; //将栈1的栈顶元素出栈 } else if(stackNumber==2){ if(S->top2==MAXSIZE){ return ERROR; //说明栈2已是空栈,溢出 } *e=S->data[S->top2++]; //将栈 2 的栈顶元素出栈 } return OK; }
typedef struct StackNode { SElemType data; struct StackNode *next; }StackNode,*LinkStackPtr; typedef struct LinkStack { LinkStackPtr top; int count; }LinkStack;
Status Push(LinkStack *S,SElemType e) { LinkStackPtr p=(LinkStackPtr)malloc(sizeof(StackNode)); p->data=e; p->next=S->top; //把当前的栈顶元素赋值给新结点的直接后继 S->top=p; //将新的结点s赋值给栈顶指针 S->count++; return OK; }
Status Pop(LinkStack *S,SElemType *e) { LinkStackPtr p; if(StackEmpty(*S)){ return ERROR; } *e=S->top->data; p=S->top; //将栈顶结点赋值给p S->top=S->top->next; //使得栈顶指针下移一位,指向后一结点 free(p); //释放结点p S->count--; return OK; }