重学数据结构——栈

【知识框架】

  • 顺序栈
  • 共享栈
  • 链栈
  • 栈的应用

【栈】

只允许在一端进行插入或删除操作的线性表,四个字:“先进后出”

向栈中插入元素称为入栈,从栈中删除元素称为出栈。

【栈的操作】

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.优先队列

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值