【知识框架】
- 顺序栈
- 共享栈
- 链栈
- 栈的应用
【栈】
只允许在一端进行插入或删除操作的线性表,四个字:“先进后出”
向栈中插入元素称为入栈,从栈中删除元素称为出栈。
【栈的操作】
1、空栈状态:top=-1
2、入栈:top=top+1;A[top]=a;
3、满栈状态:top=Maxsize
4、出栈:e=A[top];top=top-1;
“上溢”现象——当栈满时,再作进栈运算产生空间溢出的现象。
“下溢”现象——当栈空时,作退栈运算产生的溢出现象。
【共享栈(双栈)】
两个栈共同开辟一个存储空间,让一个栈的栈底为该空间的始端,另一栈的栈底为该空间的末端,当元素进栈时,都从两段向中间延伸,这样能使剩余的空间为任意一个栈所使用。
【共享栈操作】
栈空条件:top1==-1;top2==Maxsize;
栈满条件:top1==top2-1
栈1(其底为空间始端)的操作:
入栈:top1=top1+1;A[top1]=val;
出栈:e=A[top1];top1=top1-1;
栈2(其底为空间末端)的操作:
入栈:top2=top2-1;A[top2]=val;
出栈:e=A[top2];top2=top2+1;
【共享栈习题】
例1、为了减少栈溢出的可能性,可以让两个栈共享一片连续存储空间,两个栈的栈底分别设在这片空间的两端,这样只有当( A)时,才可能产生上溢。
A.两个栈的栈顶在栈空间的某一位置相遇
B.其中一个栈的栈顶达到栈空间的中心点
C.两个栈的栈顶同时到达栈空间的中心点
D.两个栈均不空,且一个栈的栈顶到达另一个栈的栈底
【链栈操作】
栈空:top=NULL;
栈满:不存在滴;
入栈:①p->next=top;②top=p;
出栈:②e=top->data;②top=top->next;③free(p)
【链栈习题】
例1、如果以链表作为栈的存储结构,则退栈操作时( D )
A.必须判别栈是否满
B.对栈不做任何判别
C.判别栈元素的类型
D.必须判别栈是否为空
【顺序栈和链栈的比较】
(1)时间性能比较
顺序栈和链栈基本操作算法,时间复杂度均为O(1)。
(2)空间性能比较
初始时顺序栈必须确定一个固定的长度,所以有存储元素个数的限制和空间浪费的问题。
链栈无栈满问题(只有当内存没有可用空间时才回出现栈满,但是每个元素都需要一个指针域,从而产生了结构性开销)。
一般结论:当栈在使用过程中元素个数变化较大时,用链栈比较好,反之,应该采用顺序栈。
【栈的应用】
栈的应用:主要在括号匹配、表达式求值、递归中前缀表达式和后缀表达式
例1、中缀表达式A-(B+C/D)*E
后缀形式:ABCD/+E*-
前缀形式:-A*+B/CDE
例2、将一个递归算法改为对应的非递归算法时,通常需要使用( A )
A.栈 B.队列 C.循环队列 D.优先队列