一、题目
1、题目描述
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”,“deleteHead”]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]
示例 2:
输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
2、基础框架
- C++版本给出的基础框架如下:
3、原题链接
https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/
二、解题报告
1、思路分析
(
1
)
(1)
(1)设置两个栈,一个入队栈,一个出队栈。
(
2
)
(2)
(2)执行appendTail时,将元素放入入队栈。
(
3
)
(3)
(3)执行deleteHead时,删除出队栈的栈头元素,如果出队栈为空,则将入队栈的元素移入出队栈。再从出队栈删除栈头元素。如果入队栈也为空,返回-1。所有入栈出栈操作均根据栈规则。文章来源:https://www.toymoban.com/news/detail-428163.html
2、时间复杂度
入队操作时间复杂度为O(1)
出队操作时间复杂度为O(n)文章来源地址https://www.toymoban.com/news/detail-428163.html
3、代码详解
class CQueue {
public:
stack<int> s1;
stack<int> s2;
CQueue() {
}
void appendTail(int value) {
s1.push(value);
}
int deleteHead() {
int re = -1;
if (!s2.empty()) {
re = s2.top();
s2.pop();
} else if (!s1.empty()){
while (!s1.empty()){
s2.push(s1.top());
s1.pop();
}
re = s2.top();
s2.pop();
}
return re;
}
};
三、本题小知识
到了这里,关于【栈和队列】剑指 Offer 09. 用两个栈实现队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!