问题描述

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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]

提示:

1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用

解题思路

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

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

实现代码

class CQueue {//维护两个成员变量s1和s2,其中s1主要支持插入元素,s2支持删除元素Stack<Integer> s1;Stack<Integer> s2;public CQueue() {       //在构造方法中创建对象s1=new Stack<>();s2=new Stack<>();}//队尾入队时直接将元素压入栈s1中public void appendTail(int value) {s1.push(value);         }//删除元素时,如果s2中存在元素,那么直接把s2栈顶元素删除即可。//如果s2为空,那么需要把s1中的全部元素都出栈压入到s2栈中,此时//s2栈中各个元素出栈的顺序其实就是模拟队列中出队的顺序。//当然,可能s1本身也为空,所以s2也可能为空,如果为空,返回-1,否则弹出s2栈顶元素public int deleteHead() {if(!s2.empty()){return s2.pop();}else{while(!s1.empty()){s2.push(s1.pop());}}if(s2.empty()){return -1;}else{  return s2.pop();}   }
}

剑指Offer09-用两个栈实现队列相关推荐

  1. 剑指Offer09. 用两个栈实现队列

    class CQueue {public:stack<int> stack1,stack2;CQueue() {//初始化栈while(!stack1.empty()){stack1.po ...

  2. [剑指offer] 用两个栈实现队列

    本文首发于我的个人博客:尾尾部落 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路 两个栈 stack1 和 stack2: push 动作都在 ...

  3. 剑指offer——用两个栈实现队列

    题目:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路: 当stack2不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出.当stack2 ...

  4. 剑指offer-JZ9 用两个栈实现队列(C++,附思路)

    描述 用两个栈来实现一个队列,使用n个元素来完成 n 次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能. 队列中的元素为int类型.保证操作合法,即保证pop操作时队列内已有元 ...

  5. 【栈与队列】剑指offer:两个栈模拟队列

    栈:先进后出 队列:先进先出 所以,只要分3种情况写即可 class Solution { public:void push(int node) {stack1.push(node);}int pop ...

  6. 剑指offer五:两个栈实现一个队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. package com.jianzhioffer;import java.util.Stack;publ ...

  7. 剑指offer 用2个栈实现队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解决方案: import java.util.Stack;public class Solution { ...

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

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

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

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

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

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

最新文章

  1. linux shell (()) 双括号运算符使用
  2. ajax传递参数给springmvc
  3. javascript / node.js / npm install 时 --save 和 --save-dev 的区别
  4. java中gc的认识,java JVM GC 笔记(个人对GC 或JVM 的了解)
  5. python 并行计算库_Python 大规模数据存储与读取、并行计算:Dask库简述
  6. ZOJ 3432 Find the Lost Sock (水题)
  7. [渝粤教育] 北京科技大学 离散数学 参考 资料
  8. 解决 Kotlin 换页符提示错误 Illegal escape f 无法使用问题
  9. 向上滚动的文字的淡入淡出效果
  10. 从产品的特点看产品思维
  11. php设计网站课程报告,在线课程网站设计与实现-开题报告
  12. ADC相关参数之---INL和DNL
  13. JS数字区间比较大小的写法
  14. 全国物流信息网发布台风的来临
  15. C/C++利用gotoxy()函数改变光标位置的实现方法
  16. 欧姆龙CP1H+CIF11与海利普变频器modbus通讯
  17. Prometheus控制台和仪表盘
  18. Win7产品密钥大收集
  19. android 暴风影音目录,手机暴风影音缓存文件存储位置在哪 怎么找到手机暴风影音缓存文件...
  20. 基于朴素贝叶斯的文本分类算法

热门文章

  1. __FILE__, __LINE__, __FUNCTION__
  2. 拳皇全明星伺服务器维护,拳皇全明星5月31日更新公告_拳皇全明星5月31日更新内容介绍_玩游戏网...
  3. python二分法查找数字_Python——二分法查找
  4. java如何记住登录状态_Spring security实现记住我下次自动登录功能过程详解
  5. redis清理缓存_大话Redis问题
  6. python测试脚本截图_Python+selenium实现截图图片并保存截取的图片
  7. 【算法】给定一个链表,判断链表中是否有环
  8. 【Elasticsearch】将数据预加载到文件系统缓存中
  9. 【kafka】服务器上Kafka启动 Cannot allocate memory
  10. 【java】Java 中的 Exchanger 线程同步使用方法 线程之间交换数据