首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >剑指 Offer(C++版本)系列:剑指 Offer 09 用两个栈实现队列

剑指 Offer(C++版本)系列:剑指 Offer 09 用两个栈实现队列

作者头像
我是管小亮
发布于 2021-07-20 03:23:59
发布于 2021-07-20 03:23:59
27400
代码可运行
举报
运行总次数:0
代码可运行

同步GitHub在此 ? https://github.com/TeFuirnever/GXL-Skill-Tree

1、题干

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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 次调用
通过次数202,426提交次数280,577


2、递归法

队列是先入先出,栈是先入后出。

算法流程:

  1. 加入队尾 appendTail(int value) 函数:把数字 value 加入栈 stk 即可;
  2. 加入复制 copy(stack&a, stack&b) 函数,把栈 a 的元素复制到栈 b 中;
  3. 删除队首 deleteHead() 函数:
    1. 当栈 stk 为空,即两个栈都为空,因此返回 -1 ;
    2. 把 stk 中所有元素 copy() 复制到 cache 中;
    3. 记录 cache 的栈顶元素,并删除该元素;
    4. 把 cache 中所有元素 copy() 复制到 stk 中;
    5. 直接返回被记录的栈顶元素。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//面试题09. 用两个栈实现队列
//标准做法
class CQueue {
public:
 stack<int> stk, cache;
 CQueue() {

 }

 void appendTail(int value) {
  stk.push(value);
 }

 void copy(stack<int> &a, stack<int> &b) {
  while (a.size()) {
   b.push(a.top());
   a.pop();
  }
 }

 int deleteHead() {
  if (stk.empty())
  {
   return -1;
  }
  copy(stk, cache);
  int res = cache.top();
  cache.pop();
  copy(cache, stk);
  return res;
 }
};

/**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/

4、复杂度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
插入元素

时间复杂度:O(1)。
空间复杂度:O(n)。最差情况下,需要保存n个元素。

删除元素

时间复杂度:O(n)。
空间复杂度:O(n)。最差情况下,需要保存n个元素。
*/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员管小亮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【每日一题】【leetcode】18.栈&队列-用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 难易程度:easy
aneutron
2022/08/10
2490
LeetCode 剑指 Offer 09. 用两个栈实现队列(swift)
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
freesan44
2021/08/18
3730
图解LeetCode——剑指 Offer 09. 用两个栈实现队列(难度:简单)
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
爪哇缪斯
2023/05/10
1830
图解LeetCode——剑指 Offer 09. 用两个栈实现队列(难度:简单)
LeetCode 剑指 Offer 09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
freesan44
2020/07/01
3410
剑指Offer - 面试题9. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
Michael阿明
2020/07/13
3240
剑指Offer - 面试题9. 用两个栈实现队列
剑指 Offer 09. 用两个栈实现队列「建议收藏」
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
全栈程序员站长
2022/09/22
2210
剑指 Offer 09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
且陶陶
2023/04/12
1760
Leetcode|入栈+出栈实现队列|剑指 Offer 09. 用两个栈实现队列
《225. 用两个队列实现栈》 《剑指 Offer 09. 用两个栈实现队列》 1 入栈+出栈实现队列 一个栈用于入队,一个栈用于出队操作 class CQueue { public: stack<int> stk1, stk2; // stk1用于入队,stk2用于出队 CQueue() { while (!stk1.empty()) stk1.pop(); while (!stk2.empty()) stk2.pop(); }
SL_World
2022/01/10
3500
Leetcode|入栈+出栈实现队列|剑指 Offer 09. 用两个栈实现队列
剑指 Offer:09. 用两个栈实现队列
1. 题目 剑指 Offer 09. 用两个栈实现队列 2. 描述 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1: 输入: [“CQueue”,“appendTail”,“deleteHead”,“deleteHead”] [[],[3],[],[]] 输出:[null,null,3,-1] 示例 2: 输
村雨遥
2022/06/15
1750
剑指 Offer 09. 用两个栈实现队列
队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,
Vincent-yuan
2021/06/29
2540
剑指 Offer 09. 用两个栈实现队列C++
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
莫浅子
2022/11/18
2180
剑指 Offer 09. 用两个栈实现队列C++
LeetCode-面试题09-用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
benym
2022/07/14
2070
剑指 offer| 09. 用两个栈实现队列
我们知道,队列的特点是“先进先出”,栈的特点是“先进后出”。我们来看看下面的操作:
孟君
2023/02/23
3260
剑指 offer| 09. 用两个栈实现队列
《剑指 Offer(第 2 版)》栈部分JavaScript题解
《剑指 Offer(第 2 版)》通行全球的程序员经典面试秘籍。剖析典型的编程面试题,系统整理基础知识、代码质量、解题思路、优化效率和综合能力这 5 个面试要点。
用户8921923
2022/10/24
2760
《剑指 Offer(第 2 版)》栈部分JavaScript题解
剑指Offer题解 - Day1
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
chuckQu
2022/08/19
1780
《剑指 offer》刷题记录之:树 & 栈和队列
其中每个子树的遍历顺序同样满足对应的前序或中序遍历顺序。对于这一题,我们可以采用「递归」或者「迭代」(循环)的方式来求解。递归的方法相对来说要更加简洁一些,而迭代的方法则不是非常好理解。
口仆
2020/08/14
3450
剑指Offer 面试题09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
手撕代码八百里
2020/07/28
7190
剑指offer | 面试题7:用两个栈实现队列
提示:1 <= values <= 10000。 最多会对 appendTail、deleteHead进行 10000 次调用
千羽
2021/12/29
2520
剑指offer | 面试题7:用两个栈实现队列
LeetCode 上的一道题目
今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题09. 用两个栈实现队列。
五分钟学算法
2020/06/28
4600
LeetCode 上的一道题目
leetcode栈之用两个栈实现队列
这里使用两个栈,一个用于进栈,一个用于出栈;appendTail的时候先遍历out栈将其元素取出来push到in栈里头,最后在push该value;deleteHead的时候先遍历in栈将其元素取出来push到out栈里头,最后在pop出来。
code4it
2020/10/02
2850
leetcode栈之用两个栈实现队列
相关推荐
【每日一题】【leetcode】18.栈&队列-用两个栈实现队列
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验