基本运算栈的基本运算

基本运算栈的基本运算(1)InitStack(S)构造一个空栈S

(2)StackEmpty(S)判栈空

若S为空栈,则返回TRUE,否则返回FALSE

(3)StackFull(S)判栈满

若S为满栈,则返回TRUE,否则返回FALSE

注意:该运算只适用于栈的顺序存储结构

(4)Push(S,x)进栈

若栈S不满,则将元素x插入S的栈顶

(5)Pop(S)退栈

若栈S非空,则将S的栈顶元素删去,并返回该元素

(6)StackTop(S)取栈顶元素

若栈S非空,则返回栈顶元素,但不改变栈的状态

顺序栈栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表

1、顺序栈的类型定义#defineStackSize100//假定预分配的栈空间最多为100个元素typedefcharDataType;//假定栈元素的数据类型为字符typedefstruct{DataTypedata[StackSize];inttop;}SeqStack;注意:①顺序栈中元素用向量存放②栈底位置是固定不变的,可设置在向量两端的任意一个端点③栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶位置2、顺序栈的基本操作前提条件:设S是SeqStack类型的指针变量

若栈底位置在向量的低端,即S->data是栈底元素

(1)进栈操作进栈时,需要将S->top加1注意:①S->top==StackSize-1表示栈满②"上溢"现象--当栈满时,再做进栈运算产生空间溢出的现象 

上溢是一种出错状态,应设法避免

(2)退栈操作退栈时,需将S->top减1注意:①S->toptop=-1;}(2)判栈空intStackEmpty(SeqStack*S){returnS->top==-1;}(3)判栈满intStackFull(SeqStack*SS){returnS->top==StackSize-1;}(4)进栈voidPush(S,x){if(StackFull(S))Error("Stackoverflow");//上溢,退出运行S->data[++S->top]=x;//栈顶指针加1后将x入栈}(5)退栈DataTypePop(S){if(StackEmpty(S))Error("Stackunderflow");//下溢,退出运行returnS->data[S->top--];//栈顶元素返回后将栈顶指针减1}(6)取栈顶元素DataTypeStackTop(S){if(StackEmpty(S))Error("Stackisempty");returnS->data[S->top];}4、两个栈共享同一存储空间当程序中同时使用两个栈时,可以将两个栈的栈底设在向量空间的两端,让两个栈各自向中间延伸

当一个栈里的元素较多,超过向量空间的一半时,只要另一个栈的元素不多,那么前者就可以占用后者的部分存储空间

只有当整个向量空间被两个栈占满(即两个栈顶相遇)时,才会发生上溢

因此,两个栈共享一个长度为m的向量空间和两个栈分别占用两个长度为└m/2┘和┌m/2┐的向量空间比较,前者发生上溢的概率比后者要小得多

链栈栈的链式存储结构称为链栈 

1、链栈的类型定义链栈是没有附加头结点的运算 受限的单链表

栈顶指针就是链表的头指针

链栈的类型说明如下:typedefstructstacknode{DataTypedatastructstacknode*next}StackNode;typedefstruct{StackNode*top;//栈顶指针}LinkStack;注意:①LinkStack结构类型的定义是为了方便在函数体中修改top指针本身②若要记录栈中元素个数,可将元素个数属性放在LinkStack类型中定义

2、链栈的基本运算(1)置栈空VoidInitStack(LinkStack*S){S->top=NULL;}(2)判栈空intStackEmpty(LinkStack*S){returnS->top==NULL;}(3)进栈voidPush(LinkStack*S,DataTypex){//将元素x插入链栈头部StackNode*p=(StackNode*)malloc(sizeof(StackNode));p->data=x;p->next=S->top;//将新结点*p插入链栈头部S->top=p;}(4)退栈DataTypePop(LinkStack*S){DataTypex;StackNode*p=S->top;//保存栈顶指针if(StackEmpty(S))Error("Stackunderflow.");//下溢x=p->data;//保存栈顶结点数据S->top=p->next;//将栈顶结点从链上摘下free(p);returnx;}(5)取栈顶元素DataTypeStackTop(LinkStack*S){if(StackEmpty(S))Error("Stackisempty.")returnS->top->data;}注意:链栈中的结点是动态分配的,所以可以不考虑上溢,无须定义StackFull运算 

以上内容由大学时代综合整理自互联网,实际情况请以官方资料为准。

相关