牛客网刷题笔记记录。参考自:https://cuijiahua.com/blog/2017/11/basis_5.html
一.题目
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
二.思路分析
乍一看这道题目时感觉很简单不就是把数据们从一个栈里倒腾到另一个栈然后输出就行了吗?但仔细思考后发现遗漏了输入输出随机交替出现时产生的问题。不过还是很简单的,大致思路如下:
我们要的是“队列”:先进先出
我们有的是“栈”:先进后出;
所以将一个栈全部输出存到另一个栈后,另一个栈的输出就是我们想要“队列”的输出了。唯一要考虑的就是如何合理的利用这两个栈并且保证接下来的输入不会对之前已加入元素的输出造成影响。做法如下:
POP操作:
当stack2中不为空时,在stack2中的栈顶元素是最先进入队列的元素,可以弹出。如果stack2为空时,我们把stack1中的元素逐个弹出并压入stack2。由于先进入队列的元素被压倒stack1的栈底,经过弹出和压入之后就处于stack2的栈顶,有可以直接弹出。
PUSH操作:
如果有新元素d插入,我们直接把它压入stack1即可。
流程示意图:
三.编程实现
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if(stack2.empty())
{
while(!stack1.empty())
{
int temp=stack1.top();
stack1.pop();
stack2.push(temp);
}
}
int temp=stack2.top();
stack2.pop();
return temp;
}
private:
stack<int> stack1;
stack<int> stack2;
};