【LeetCode】剑指 Offer 09. 用两个栈实现队列
【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. 用两个栈实现队列相关推荐
- Leetcode 剑指 Offer 09. 用两个栈实现队列 (每日一题 20210915)
用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,deleteHea ...
- 《LeetCode力扣练习》剑指 Offer 09. 用两个栈实现队列 Java
<LeetCode力扣练习>剑指 Offer 09. 用两个栈实现队列 Java 一.资源 题目: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 de ...
- java 栈和队列实现迷宫代码_LeetCode每日一题--剑指 Offer 09. 用两个栈实现队列(Java)
DailyChallenge 剑指 Offer 09. 用两个栈实现队列 Easy20200630 Description 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTai ...
- 【双100%提交】剑指 Offer 09. 用两个栈实现队列
立志用最少的代码做最高效的表达 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队 ...
- 剑指 Offer 09. 用两个栈实现队列(相邻相同操作只需要移动一次)
题目 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,delete ...
- 剑指offer 09.用两个栈实现队列
用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,deleteHea ...
- 剑指 Offer 09. 用两个栈实现队列
import java.util.Stack;class CQueue {// 模拟队列入private Stack<Integer> stack1;// 模拟队列出private Sta ...
- 【剑指offer】 用两个栈实现队列 java实现
[剑指offer] 用两个栈实现队列 题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 分析: 栈和队列的性质,栈是先进后出的,而队列是先进先出的.对于栈我 ...
- 剑指Offer #05 用两个栈实现队列(模拟)
题目来源:牛客网-剑指Offer专题 题目地址:用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题目解析 首先,我们需要知道一下基本知 ...
最新文章
- python图合并_Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
- python input与返回值-Python 详解基本语法_函数_返回值
- (Mybatis)日志工厂
- flask查询mysql数据展示_flask再学习-思考之怎么从数据库中查询数据在页面展示!...
- SparkSQL操作Hive Table
- 读取XML文件的节点内的内容
- IDEA 快捷键终极大全
- [转]ASP.NET页面HEAD区动态设置全攻略
- 4.c++模式设计-建造者模式
- 学了这么久的Redis,竟然还不知道事务
- 3.10 datetime
- 视觉里程计07 Qt的一些bug修改记录
- linux判断是否能上网_如何判断飘窗是否能砸掉?砸掉飘窗可以怎么利用?
- PHP 判断字符的编码 并输出想要的编码格式字符 (转)
- 44. Wildcard Matching (String; DP, Back-Track)
- express 是什么
- 瑞利-贝纳尔对流(Rayleigh–Bénard convection)
- 揭秘收入中常见的避税方法
- 做计算机用英语怎么读,计算机英语怎么读
- C# 获取系统开机时间
热门文章
- 检测php常量是否存在,php判断变量常量是否存在_PHP教程
- dedecms php5.4 无法退出后台,DedeCMS 织梦在 Windows 的 PHP5.4 环境下登录后台空白的解决办法...
- 90度旋转 flip opencv_基于Hu距的图像旋转矫正之OpenCV实现
- html5实现单点登录,用 Authing 10分钟实现单点登录(SSO)
- Git 本地仓库与远程仓库链接
- PX Deq: Execution Msg 等待事件
- libevent在windows平台下通过vs进行编译
- 【bzoj1036】 ZJOI2008—树的统计Count
- java 编译中没有清除之前编译出来的文件。
- 修改CentOS系统的默认启动级别