数据结构与算法--(二)-栈和队列对比总结

栈和队列对比

在上一节我们谈到链表的几种特殊形式。链表是线性表的链接存储,我们知道一般线性表示可以在任意位置进行插入删除操作的,今天我们讲两种特殊的线性表结构,一种是仅可以在表尾进行插入和删除的栈-线性表,一种是只允许在一端插入,另外一端删除的线性表–队列。每一种都分别有顺序结构和链接存储

  1. 定义对比
    在这里插入图片描述
  2. 栈和队列的链接存储结构及实现
    思路,先谈存储结构如何改—如何定义存储结构—操作实现


    这个就是把front放到前一个数据的指针



  3. 栈和队列的顺序存储结构及实现(分开来看)
    思路,先谈存储结构如何改—如何定义存储结构—操作实现




这里说明一点 队列顺序存储还是需要借助链接,本质上还是链接。


要确保元素位于队首,一个接一个向前移动到队首

但是如果前面出去,front向后移,空出很多位置,后面入队,rear也向后移动,进不来前面的空位置,前面的位置浪费,后面空间不足,因此我们使用循环,像一个圆盘转。



3…栈和队列的不同应用对比
栈的应用1----可用于递归调用


入栈

要求计算5的阶乘;
1):调用test函数时传入5,即首先在栈中划出一个记录块做为函数test(5)的执行环境;执行到最后结果为: 5 * test(4);
2):上一个函数的返回值中调用函数test(4),因此继续指向新的记录块,用于执行函数test(4);执行到最后结果为: 4 * test(3);
3):上一个函数的返回值中调用函数test(3),因此继续指向新的记录块,用于执行函数test(3);执行到最后结果为: 3 * test(2);
4):上一个函数的返回值中调用函数test(2),因此继续指向新的记录块,用于执行函数test(2);执行到最后结果为: 2 * test(1);
5):上一个函数的返回值中调用函数test(1),因此继续指向新的记录块,用于执行函数test(1);执行到最后test(1)=1;
此时进栈操作已经到达了递归终止的条件,为了计算出最后的test(5)的值需要执行出栈操作;--------------------

如上图,我画了一幅出栈示意图;栈是先进后出的,所以最后进的要先出。
1):test(1)出栈,返回值为1;
2):栈帧test(2)接收test(1)返回值进行计算得出test(2) = 2 * 1 = 2;
3):test(2)出栈,栈帧test(3)接收test(2)返回值进行计算得出test(3) = 3 * 2 = 6;
4):test(3)出栈,栈帧test(4)接收test(3)返回值进行计算得出test(4) = 4 * 6 = 24;
5):test(4)出栈,栈帧test(5)接收test(4)返回值进行计算得出test(5) = 5 * 24 = 120;
6):test(5)出栈,返回值120,此时表示这一段程序已经执行完毕,计算得出5的阶乘是120;
递归函数写到这一步,貌似是已经完美了,但是你有没有想过:每一个函数test(n) = n * test (n-1)因此每一个栈帧不仅需要保存n值还要记录下一个栈帧的返回值,然后才能计算出来当前栈帧的结果,因此使用多个栈帧是不可避免的,计算5的阶乘就使用了5个栈帧。
python实现:

#计算5的阶乘
def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return (n*factorial(n-1))
 
if __name__=='__main__':
    b=int(input("请输入数字:"))
    a = factorial(b)
    print(a)

栈的应用2—递归经典问题—栈解决汉诺塔问题
在这里插入图片描述

栈的应用3–数值转换

栈的应用4—迷宫问题

在这里插入图片描述

尚未解决

串在下一章!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值