【剑指Offer】09. 用两个栈实现队列 解题报告(python & C++)
2024-09-04 04:02:32
- 作者: 负雪明烛
- id: fuxuemingzhu
- 个人博客:http://fuxuemingzhu.cn/
- 个人微信公众号:负雪明烛
题目地址:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/
题目描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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 次调用
解题方法
一个栈用来保存输入,一个栈用来输出
本题是比较常见的题目。需要两个栈,分别负责保存输入数据和输出数据。
- 数据插入时,全部进入 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 日
最新文章
- ASP.NET Core 介绍和项目解读
- IOS开发之Bug--遇到一个类型不确定的bug
- (Python )控制流语句if、for、while
- 【Xamarin报错】libpng warning : iCCP: Not recognizing known sRGB profile that has been edited
- matlab 更改横坐标坐标值的方向
- hdu4632 Palindrome subsequence ——区间动态规划
- java.util Pattern 和 Mathcer
- oracle窗口函数中range interval的使用
- Ehcache(03)——Ehcache中储存缓存的方式
- 前端模块化工具--webpack使用感受
- 漫谈GUI开发—各种平台UI开发概况
- 批处理脚本+adb命令
- Linux gzip命令
- Spark流处理调优步骤
- Netty重要概念介绍
- python datatype
- 3.2 定位shellcode
- hdu-3366 Passage 概率DP 读懂就能AC hhh
- RPC 原理
- Java 可执行jar的manifest编写