算法训练营day10

参考链接第 5 章 栈与队列 - Hello 算法 (hello-algo.com)

使用Deque - 廖雪峰的官方网站 (liaoxuefeng.com)

一、栈和队列理论基础
  1. Queue(队列):先进先出
    • 淘宝订单,淘宝下单后,订单将加入队列中,系统根据顺序处理队列中的订单
    • 各类待办事项:只要满足先进先出的都可以,打印机的任务队列,餐厅的出餐顺序
  2. Deque(双向队列):允许两头都可进可出(Double Ended Queue)
    • 这里要提一下Deque接口实现类的ArrayDeque & LinkedList中LinkedList,特别能打,既是List,又是Queue,还是Deque
  3. 栈:后入先出(注:Java中没有单独的Stack接口,因为有遗留类名字叫Stack,可以使用Deque作为Stack使用)
    • 典型应用:浏览器的后退与前进、软件中的撤销与反撤销
    • 程序内存管理,java中的main函数其实就是利用栈执行
二、用栈实现队列

栈:后入先出 -> 队列:先入先出,使用两个栈来模拟队列操作,设A,B栈

栈出队效率低下,考虑如何将第一个元素能直接pop()出来,将A中元素pop出来同时加入B中即可实现元素倒序

三、用队列实现栈
1.使用两个队列
  1. queue1作为主队列保存当前队列元素
  2. queue2作为辅助队列保存上一步操作之前队列的元素
2.使用一个队列

pop()时将弹出size - 1个元素加到队列末尾,那么队尾元素就到达了队首

  1. 重点回顾
    栈是一种遵循先入后出原则的数据结构,可通过数组或链表来实现。
    在时间效率方面,栈的数组实现具有较高的平均效率,但在扩容过程中,单次入栈操作的时间复杂度会劣化至
    。相比之下,栈的链表实现具有更为稳定的效率表现。
    在空间效率方面,栈的数组实现可能导致一定程度的空间浪费。但需要注意的是,链表节点所占用的内存空间比数组元素更大。
    队列是一种遵循先入先出原则的数据结构,同样可以通过数组或链表来实现。在时间效率和空间效率的对比上,队列的结论与前述栈的结论相似。
    双向队列是一种具有更高自由度的队列,它允许在两端进行元素的添加和删除操作。
  2. Q & A
    Q:浏览器的前进后退是否是双向链表实现?

浏览器的前进后退功能本质上是“栈”的体现。当用户访问一个新页面时,该页面会被添加到栈顶;当用户点击后退按钮时,该页面会从栈顶弹出。使用双向队列可以方便地实现一些额外操作,这个在“双向队列”章节有提到。

Q:在出栈后,是否需要释放出栈节点的内存?

如果后续仍需要使用弹出节点,则不需要释放内存。若之后不需要用到,Java 和 Python 等语言拥有自动垃圾回收机制,因此不需要手动释放内存;在 C 和 C++ 中需要手动释放内存。

Q:双向队列像是两个栈拼接在了一起,它的用途是什么?

双向队列就像是栈和队列的组合或两个栈拼在了一起。它表现的是栈 + 队列的逻辑,因此可以实现栈与队列的所有应用,并且更加灵活。

Q:撤销(undo)和反撤销(redo)具体是如何实现的?

使用两个栈,栈 A 用于撤销,栈 B 用于反撤销。

每当用户执行一个操作,将这个操作压入栈 A ,并清空栈 B 。
当用户执行“撤销”时,从栈 A 中弹出最近的操作,并将其压入栈 B 。
当用户执行“反撤销”时,从栈 B 中弹出最近的操作,并将其压入栈 A 。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值