• 作者: 负雪明烛
  • id: fuxuemingzhu
  • 个人博客:http://fuxuemingzhu.cn/
  • 个人微信公众号:负雪明烛

题目地址:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/

题目描述

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTaildeleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,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
  • 最多会对 appendTaildeleteHead 进行 10000 次调用

解题方法

一个栈用来保存输入,一个栈用来输出

本题是比较常见的题目。需要两个栈,分别负责保存输入数据和输出数据。

  • 数据插入时,全部进入 stack1 中,在 stack1 中临时保存。
  • 数据弹出时,全部从 stack2 弹出;如果 stack2 为空的,那么把 stack1 中的全部数据出栈、并入栈到 stack2 中来,然后再执行弹出的操作。

原理比较好理解:一个栈会让输入和输出的顺序是颠倒的;两个就实现了「负负得正」的结果,所以得到了一个和输入同顺序的序列(也就是实现了队列)。

下图说明了这个原理:数据插入的顺序是 [1, 2, 3, 4],全部插入 stack1 中;当要弹出的时候,从 stack2 中弹出,如果 stack2 为空,那么就把 stack1 的所有数据出栈放到 stack2 中。

python 代码如下:

class CQueue(object):

    def __init__(self):
self.stack1 = []
self.stack2 = [] def appendTail(self, value):
"""
:type value: int
:rtype: None
"""
self.stack1.append(value) def deleteHead(self):
"""
:rtype: int
"""
if not self.stack1 and not self.stack2:
return -1
if not self.stack2:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2.pop() # Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()

C++ 代码如下:

class CQueue {
private:
stack<int> st1, st2;
public:
CQueue() {
} void appendTail(int value) {
st1.push(value);
} int deleteHead() {
if (st2.empty()) {
while (!st1.empty()) {
st2.push(st1.top());
st1.pop();
}
}
if (st2.empty()) {
return -1;
}
int res = st2.top(); st2.pop();
return res;
}
}; /**
* Your CQueue object will be instantiated and called as such:
* CQueue* obj = new CQueue();
* obj->appendTail(value);
* int param_2 = obj->deleteHead();
*/

日期

2018 年 3 月 9 日
2021 年 8 月 5 日

最新文章

  1. ASP.NET Core 介绍和项目解读
  2. IOS开发之Bug--遇到一个类型不确定的bug
  3. (Python )控制流语句if、for、while
  4. 【Xamarin报错】libpng warning : iCCP: Not recognizing known sRGB profile that has been edited
  5. matlab 更改横坐标坐标值的方向
  6. hdu4632 Palindrome subsequence ——区间动态规划
  7. java.util Pattern 和 Mathcer
  8. oracle窗口函数中range interval的使用
  9. Ehcache(03)——Ehcache中储存缓存的方式
  10. 前端模块化工具--webpack使用感受
  11. 漫谈GUI开发—各种平台UI开发概况
  12. 批处理脚本+adb命令
  13. Linux gzip命令
  14. Spark流处理调优步骤
  15. Netty重要概念介绍
  16. python datatype
  17. 3.2 定位shellcode
  18. hdu-3366 Passage 概率DP 读懂就能AC hhh
  19. RPC 原理
  20. Java 可执行jar的manifest编写

热门文章

  1. Python基础之列表内置方法
  2. Webpack 打包 Javascript 详细介绍
  3. MIT6.824 分布式系统实验
  4. DBeaver客户端工具连接Hive
  5. 百度 IP 查询
  6. Ubantu nodejs卸载与二进制安装
  7. 文件管理与XMl、JSON解析
  8. OpenStack之九: 创建一个实例
  9. 【Linux】【Web】【HTTP】HTTP,TCP,SSL通讯过程
  10. 使用jquery完成抽奖图片滚动的效果