栈相关习题及详解(选择题和综合题) ——数据结构

栈的基本概念

栈的定义

:只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是限定这种线性表只能在某一端进行插入和删除操作。

栈顶:线性表允许进行插入和删除的那一端
栈底:固定的,不允许进行插入和删除的另一端
空栈:不含任何元素的空表。

进栈出栈的变化形式

最先进栈的元素,是不是就只能是最后出栈呢

答案是不一定,要看什么情况。栈对线性表的插入和删除的位置进行了限制,并没有对元素进出的时间进行限制,也就是说,在不是所有元素都进栈的情况下,进去的元素也可以出栈,只要保证是栈顶元素出栈就可以,那么变化就很多了,举例来说:

如果我们有3个整形数字元素1、2、3依次进栈,会有哪些出栈次序呢?

  • 第一种:1、2、3进,再3、2、1出。这事最简单的最好理解的一种,出栈次序为321
  • 第二种:1进,1出,2进,2出,3进,3出,出栈次序为123
  • 第三种:1进,2进,2出,1出,3进,3出,出栈次序为213
  • 第四种:1进,1出,2进,3进,3出,2出,出栈次序为132
  • 第五种:1进,2进,2出,3进,3出,1出,出栈次序为231

有没有可能是312这样的次序出栈呢,答案是不可能的,因为3先出栈,就意味着3曾经进栈,既然3进栈了,那也意味着1和2已经进栈了,此时,2一定是在1的上面,就是更接近栈顶,那么出栈只可能是321,不然不满足123一次进栈的要求,所以此时不会发生1比2先出栈的情况

栈的基本操作

InitStack(&S):初始化一个空栈S
StackEmpty(S):判断一个栈是否为空,若栈S为空返回true,否则返回false
Push(&S,x):进栈,若栈S未满,将x加入使之成为新栈顶
Pop(&S,&x):出栈,若栈S非空,弹出栈顶元素,并用x返回
GetTop(S,&x):读栈顶元素,若栈S非空,用x返回栈顶元素
ClearStack(&S):销毁栈,并释放栈S占用的存储空间。

(符号“&”是C艹特有的,用来宝石引用,有的采用C语言中的指针类型“*”,也可以达到传址的目的)

如果没有特殊要求,可以直接用这些基本的操作函数

栈的顺序存储结构(顺序栈)

顺序栈的实现

栈的顺序存储称为顺序栈,它是利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶的位置。

顺序栈可以描述为:

#define MaxSize 50              //定义栈中元素的最大个数
typedef struct{
    Elemtype data[MaxSize];     //存放栈中元素
    int top;                    //栈顶指针
}SqStack;
共享栈

利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一位数据空间,将两个栈的栈底分别设置在共享空间的两端,两个栈向共享空间的中间延伸。

两个栈的栈顶指针都指向栈顶元素,top0=-1时0号栈为空,top1=MaxSize时1号栈为空,当且仅当两个栈顶的指针相邻时,判断为占满。当0号栈进栈时top0先加1再复制,1号栈进栈时top1先减1再复制;出栈时刚好相反。

共享栈是为了更有效地利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生上溢。其存取数据的时间复杂度均为O(1)所以对存取效率没有什么影响。

事实上使用遮掩的数据结构,通常都是当两个栈的空间需求有相反关系时,也就是一个栈增长时另一个栈在缩短的情况。就像买卖股票一样,你买入时,一定是有一个你不知道的人在做卖出操作。有人赚钱,就一定有人赔钱。这样使用两栈共享空间存储方法再有比较大的意义。

当然,这里指两个具有相同数据类型的栈,类型不同不适用这种方法。

栈的链式存储结构(链栈)

采用链式存储的栈成为链栈,

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值