【LeetCode】剑指 Offer 09. 用两个栈实现队列

文章目录

  • 【LeetCode】剑指 Offer 09. 用两个栈实现队列
  • 一、双栈
  • 总结

一、双栈

维护两个栈,第一个栈支持插入操作,第二个栈支持删除操作

根据栈先进后出的特性,我们每次往第一个栈里插入元素后,第一个栈的底部元素是最后插入的元素,第一个栈的顶部元素是下一个待删除的元素。为了维护队列先进先出的特性,我们引入第二个栈,用第二个栈维护待删除的元素,在执行删除操作的时候,我们首先看下第二个栈是否为空。如果为空,我们将第一个栈里的元素一个个弹出插入到第二个栈里,这样第二个栈里元素的顺序就是待删除元素的顺序,要执行删除操作的时候我们直接弹出第二个栈的元素返回即可

成员变量

  • 维护两个栈 stack1 和 stack2,其中 stack1 支持插入操作,stack2 支持删除操作

构造方法

  • 初始化 stack1 和 stack2 为空

插入元素

插入元素对应方法 appendTail

  • stack1 直接插入元素

删除元素

删除元素对应方法 deleteHead

  • 如果 stack2 为空,则将 stack1 里的所有元素弹出插入到 stack2 里
  • 如果 stack2 仍为空,则返回 -1,否则从 stack2 弹出一个元素并返回

class CQueue {Stack<Integer> stack1;Stack<Integer> stack2;public CQueue() {stack1 = new Stack<>();stack2 = new Stack<>();}public void appendTail(int value) {stack1.push(value);}public int deleteHead() {if(stack2.empty()){                 //如果栈2 为空则把栈1 所有数据 pop 到栈2while(!stack1.empty()){stack2.push(stack1.pop());}}//如果栈1 也为空,说明队列无数据了,此时栈2 仍然为空,则返回 -1if(stack2.empty()) return -1;       return stack2.pop();                }
}
  • 时间复杂度:对于插入和删除操作,时间复杂度均为 O(1)。插入不多说,对于删除操作,虽然看起来是 O(n) 的时间复杂度,但仔细考虑下每个元素只会至多被插入和弹出 stack2 一次,因此均摊下来每个被删除的时间复杂度认为 O(1)
  • 空间复杂度:O(n),需要使用两个栈存储已有的元素

总结

学过数据结构就能很快解题,但是需要注意的就是时间复杂度。我没看题解写的算法用的时间远远多于官方题解。我一开始想的是插入元素时一步到位,先把 stack2 中的所有元素 pop 到 stack1 中,然后再把需要添加的元素 push 到 stack1 中,最后把 stack1 中的所有元素 都 pop 到 stack2,这样添加的元素就在 stack2 的栈底了,而原本在队头的元素现在仍然在 stack2 栈顶,删除元素的时候直接从 stack2 pop 就好了。这样的缺点就是,每次插入都要移动所有元素两次,所以时间复杂度为 O(n)。而官方题解,插入元素的时候不管,插入 stack1 就好了,只有需要删除元素时,才把所有元素移动到 stack2 ,并且一次性就把所有元素都移过去了,等到这一次移动的元素都删完了,才需要再次从 stack1 中取。这样每个元素至多被移动 1 一次,时间复杂度只有 O(1)

【LeetCode】剑指 Offer 09. 用两个栈实现队列相关推荐

  1. Leetcode 剑指 Offer 09. 用两个栈实现队列 (每日一题 20210915)

    用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,deleteHea ...

  2. 《LeetCode力扣练习》剑指 Offer 09. 用两个栈实现队列 Java

    <LeetCode力扣练习>剑指 Offer 09. 用两个栈实现队列 Java 一.资源 题目: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 de ...

  3. java 栈和队列实现迷宫代码_LeetCode每日一题--剑指 Offer 09. 用两个栈实现队列(Java)

    DailyChallenge 剑指 Offer 09. 用两个栈实现队列 Easy20200630 Description 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTai ...

  4. 【双100%提交】剑指 Offer 09. 用两个栈实现队列

    立志用最少的代码做最高效的表达 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队 ...

  5. 剑指 Offer 09. 用两个栈实现队列(相邻相同操作只需要移动一次)

    题目 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,delete ...

  6. 剑指offer 09.用两个栈实现队列

    用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,deleteHea ...

  7. 剑指 Offer 09. 用两个栈实现队列

    import java.util.Stack;class CQueue {// 模拟队列入private Stack<Integer> stack1;// 模拟队列出private Sta ...

  8. 【剑指offer】 用两个栈实现队列 java实现

    [剑指offer] 用两个栈实现队列 题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 分析: 栈和队列的性质,栈是先进后出的,而队列是先进先出的.对于栈我 ...

  9. 剑指Offer #05 用两个栈实现队列(模拟)

    题目来源:牛客网-剑指Offer专题 题目地址:用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题目解析 首先,我们需要知道一下基本知 ...

最新文章

  1. python图合并_Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
  2. python input与返回值-Python 详解基本语法_函数_返回值
  3. (Mybatis)日志工厂
  4. flask查询mysql数据展示_flask再学习-思考之怎么从数据库中查询数据在页面展示!...
  5. SparkSQL操作Hive Table
  6. 读取XML文件的节点内的内容
  7. IDEA 快捷键终极大全
  8. [转]ASP.NET页面HEAD区动态设置全攻略
  9. 4.c++模式设计-建造者模式
  10. 学了这么久的Redis,竟然还不知道事务
  11. 3.10 datetime
  12. 视觉里程计07 Qt的一些bug修改记录
  13. linux判断是否能上网_如何判断飘窗是否能砸掉?砸掉飘窗可以怎么利用?
  14. PHP 判断字符的编码 并输出想要的编码格式字符 (转)
  15. 44. Wildcard Matching (String; DP, Back-Track)
  16. express 是什么
  17. 瑞利-贝纳尔对流(Rayleigh–Bénard convection)
  18. 揭秘收入中常见的避税方法
  19. 做计算机用英语怎么读,计算机英语怎么读
  20. C# 获取系统开机时间

热门文章

  1. 检测php常量是否存在,php判断变量常量是否存在_PHP教程
  2. dedecms php5.4 无法退出后台,DedeCMS 织梦在 Windows 的 PHP5.4 环境下登录后台空白的解决办法...
  3. 90度旋转 flip opencv_基于Hu距的图像旋转矫正之OpenCV实现
  4. html5实现单点登录,用 Authing 10分钟实现单点登录(SSO)
  5. Git 本地仓库与远程仓库链接
  6. PX Deq: Execution Msg 等待事件
  7. libevent在windows平台下通过vs进行编译
  8. 【bzoj1036】 ZJOI2008—树的统计Count
  9. java 编译中没有清除之前编译出来的文件。
  10. 修改CentOS系统的默认启动级别