栈(Stack)
只允许在一端进行插入或删除操作的线性表
栈顶(Top):栈中允许进行插入和删除操作的那一端;
栈底(Bottom):固定的,不允许进行插入或删除的另一端
1.栈是受限的线性表,所以自然具有线性关系。
2.栈中元素后进先出。
栈的顺序存储==顺序栈
#define MaxSize 50 //定义栈中元素的最大个数 typedef struct{Elemtype data[MaxSize]; //存放栈中元素 }Sqstack; //顺序栈简写
1.Top的值不能超过MaxSize;
2.空栈的判定条件通常为top==-1,满栈的判定条件为top=MaxSize-1,栈中元素个数为top+1.
顺序栈的操作:
1.判空
bool StackEmpty(SqStack S){if(S.top==-1) return true;else return false; }
2.进栈
bool Push(SqStack &S,Elemtype x){if(S.top==MaxSize-1) return false;S.data[++S.top]=x; return true; }
3.出栈
bool Pop(SqStack &S,Elemtype &x){if(S.top==-1) return false;x=S.data[S.top--]; return true; }
4.读取栈顶元素
bool GetTop(SqStack S,Elemtype &x){if(S.top==-1) return false;x=S.data[S.top];return true; }
共享栈
顺序栈的存储空间大小需要事先开辟好,对每个栈各自单独开辟存储空间的利用率不如将各个栈存储空间共享。
栈满条件下:指针top1与指针top2只相差1,即top1+1=top2.
结构:
#define MaxSize 100 //定义栈中元素的最大个数 typedef struct{Elemtype data[MaxSize]; //存放栈中元素int top1;int top2; }SqDoublestack; //顺序共享栈简写
进栈:
bool Push(SqDoubleStack &S,ElemType x,int stackNum0{if(S.top1+1=S.top2) return false;if(stackNum==1) S.data[++S.top1]=x;//栈1有元素进栈if(stackNum==2) S.data[++S.top2]=x;//栈2有元素进栈return true; }
栈的链式存储==链栈
头指针当作栈顶指针,栈顶存放在单链表头部。
typedef struct SNode{ElemType data; //存放栈中元素struct SNode *next; //栈顶指针 }SNode *SLink //链栈的结点 typedef struct LinkStack{SLink top; //栈顶指针int count; //链栈结点数 }LinkStack //链栈
1.链栈一般不存在满栈
2.空栈的判定关系一般为top=NULL
进栈
bool Push(LinkStack &S,ElemType x){SLink p=(SLink)mallo((sizeof(SNode));//给新元素分配空间p->data=x; //新元素的值p->next=s->top; //p的后继指针指向新的元素s->top=p; //栈顶指针指向新的元素s->count++; //栈中元素加1return true; }
出栈
bool Pop(LinkStack &S, ElemType &x){if(S->top==NULL) return false;x=S->top->data; //栈顶元素值Slink p=S->top; //辅助指针S->top=S->top->next; //栈顶指针后移free(p); //释放被删除数据的存储空间S->count--; 栈中元素个数减1return true; }