用栈实现队列:
题干:
这样一个题目,在力扣中出现,用栈实现队列的四个操作:
1.queue.top():得到队首元素。
2.queue.pop():队首出队。
3.queue.push():队尾入队。
4.queue.empty():判断队列是否为空,1为空,0为非空。
分析思路:
一个栈肯定不行,我们考虑用两个栈行不行?
搬运一下Carl师兄的动态实现图,毕竟太生动了。
两个栈,一个是输入栈in,一个是输出栈out。
首先我们来看一下如何判断队列为空。这个没什么难度,由于两个栈共同组成一个队列,因此当两个栈都为空时,整个队列为空。
进队push操作,正常往in栈压就相当于已经进入队列内,这时候我们不需要管out栈,不需要往out栈压数据。出队pop操作,Cral师兄的思路非常清晰。出队的实现肯定需要out栈来做,那么肯定要把已经压入in栈的数据转到out栈来做。这个过程其实可以将栈的性质彻底颠倒。原本3,4在in栈内,4后入则先出,当来到了out栈,就变成了栈底数据,变成了后入后出。后入后出,不就是队列了吗?
在具体pop操作实现上,需要判断out栈是否为空,如果为空,那么从in栈导入全部的数据,然后一一出栈。如果非空,那么直接出栈即可。
top操作实际上和pop操作差不多。
答案:
#include<bits/stdc++.h>
using namespace std;
class MyQueue {
public:
stack<int> in;
stack<int> out;
void push(int x) {
in.push(x);
}
int pop() {
int e;
if(out.empty())
{
while (!in.empty())
{
out.push(in.top());
in.pop();
}
}
e = out.top();
out.pop();
return e;
}
int peek() {
int e = 0;
if (out.empty())
{
while (!in.empty())
{
out.push(in.top());
in.pop();
}
}
e = out.top();
return e;
}
bool empty() {
return in.empty() && out.empty();
}
};