1.问题描述

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

示例 1:
输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[3],[],[]]
输出:[null,null,3,-1]

示例 2:
输入:[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

2.解题思路

成员变量:维护两个栈 stack1 和 stack2,其中 stack1 支持插入操作,stack2 支持删除操作
构造方法:初始化 stack1 和 stack2 为空
插入元素:插入元素对应方法 appendTail,对应stack1 直接插入元素
删除元素:删除元素对应方法 deleteHead

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

时间复杂度:对于插入和删除操作,时间复杂度均为 O(1)。插入不多说,对于删除操作,虽然看起来是 O(n)的时间复杂度,但是仔细考虑下每个元素只会「至多被插入和弹出 stack2 一次」,因此均摊下来每个元素被删除的时间复杂度仍为 O(1)。

空间复杂度:O(n)。需要使用两个栈存储已有的元素。

class CQueue {private Stack<Integer> stack1;private Stack<Integer> stack2;public CQueue() {stack1 = new Stack<Integer>();stack2 = new Stack<Integer>();}public void appendTail(int value) {stack1.push(value);}public int deleteHead() {if (stack2.isEmpty()){while (!stack1.isEmpty()){stack2.push(stack1.pop());}}if (stack2.isEmpty()){return -1;}else{int item = stack2.pop();return item;}}
}/*** Your CQueue object will be instantiated and called as such:* CQueue obj = new CQueue();* obj.appendTail(value);* int param_2 = obj.deleteHead();*/

35--用两个栈实现队列相关推荐

  1. 编程题练习 两个栈实现队列

    两个栈实现队列 1.判断队列为空: 当栈s1 和 s2都为空时,那么队列为空 2.入队操作: 直接将数据加入到s1栈中 3.出队操作:当 s2 栈不为空的时候, s2 栈直接执行出栈操作就可以得到出队 ...

  2. 剑指offer:面试题09. 用两个栈实现队列

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

  3. 剑指offer_第5题_用两个栈实现队列

    题目描述 用两个栈来实现一个队列 完成队列的Push和Pop操作 队列中的元素为int类型 理解 关于栈 什么是栈 栈的抽象数据类型 Python实现栈 关于队列 什么是队列 队列抽象数据类型 Pyt ...

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

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

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

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

  6. 【干货】容器适配器实现两个栈模拟队列

    用两个栈模拟队列的思想就是"倒水思想",这里我们用自定义类型模拟出线性表,再用线性表做容器实现栈的数据结构,最后用栈来实现队列,代码如下: #include<iostream ...

  7. 剑指offer第二版-9.用两个栈实现队列

    描述:使用两个栈实现一个队列.队列中实现尾部插入和头部删除函数. 思路:stack1负责插入,stack2负责弹出,如果stack2为空了,将stack1的元素依次弹出并存放到stack2中,之后对s ...

  8. 《剑指offer》-- 构建乘积数组、求1+2+3+...+n、不用加减乘除做加法、包含min函数的栈、用两个栈实现队列

    一.构建乘积数组: 1.题目: 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*. ...

  9. 《剑指offer》第九题(用两个栈实现队列)

    // 面试题:用两个栈实现队列 // 题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail // 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的 ...

  10. 栈一:用两个栈实现队列

    /**  * 题目:用两个栈实现队列  * 描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.  * 解决方案:方法一:一个作为存储用,一个作为弹出用  * * ...

最新文章

  1. 查找Excel的Sheetname的方法
  2. 制表符补全位数在idea和eclipse中的区别
  3. 归档程序错误。在释放之前仅限于内部连接
  4. 从0搭建一个Springboot+vue前后端分离项目(二)使用idea进行页面搭建+页面搭建
  5. C和指针之部分理解和编码总结
  6. Google C2Dm相关文章
  7. vhdl和c语言,VHDL语言中的信号、变量与常量异同比较(转)
  8. 两个关于JAVA String的小问题
  9. Python使用标准库urllib模拟浏览器爬取网页内容
  10. 71. Simplify Path
  11. 【育儿日记2】兔子不要上幼儿园
  12. 如何在苹果Mac中使用聚焦搜索 NTFS 格式磁盘?
  13. zabbix重点笔记
  14. 最强面试题整理第二弹:Python 进阶面试题(附答案)
  15. 修改斐讯k3天气服务器,夏天了,给斐讯K3换智能调温套件降降温
  16. Alexa Voice Server 实现的 Android APK 聊天机器人
  17. supergo定位软件_super go定位修改下载
  18. python 安全编码代码审计
  19. Authorization loop detected on Conduit with realm “WSMAN“
  20. 手机厂商筑起APP的“垄断”高墙:用户下载选择权“名存实亡”

热门文章

  1. 给定没有重复数字的序列,将其全排列
  2. 安装solc模块4.25版本
  3. JIRA 5.0.1 发布
  4. 网站程序员的程序员成长之路大概分几个阶段 和未来的发展
  5. 动态生成表格、隐藏表格、选中删除任意行、jquery、输入验证
  6. 根据库位获取仓库id
  7. shell字符串的用法
  8. Mysql 替换字段的一部分内容
  9. JAVA自学笔记08
  10. 2017.9.5 postgresql加密函数的使用