- 棧:限定僅在表尾進行插入和刪除操做的線性表,後進先出的線性表,簡稱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; }