用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
栈是先进后出,队列是先进先出。
要想实现先进入的元素先出去,其实很简单,就是把把压入第一个栈的元素在反过来压到第二个栈里,这样顺序就正好反过来了。
原理简单,实现时还要考虑几个细节。
- 从第一个栈压入第二个栈什么时候操作?简单,当第二个栈被弹空了,或者刚开始什么都没有,就需要从第一个栈里拿数据了。也就是说,只有我要弹出数据时,这个操作才有必要做。
- 弹出的过程中再次压入队列是否有问题?没有问题。如果弹出的过程中,又压入队列,并不影响整个队列的顺序。
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if (stack2.size()<=0)
{
while(!stack1.empty())
{
int data = stack1.top();
stack1.pop();
stack2.push(data);
}
}
int res = stack2.top();
stack2.pop();
return res;
}
private:
stack<int> stack1;
stack<int> stack2;
};
类似的还有用栈来模拟队列,这里我们不考虑使用STL的queue中back方法,只使用最原始的队列先进先出的原则模拟。
这里思路上和上面有所不同,前面实际上是要用第二个栈把第一个栈的顺序反过来,这个题目就不是这样了,是用第二个队列先把第一个队列的数存起来,这样方便拿到最末尾的数,因此代码上写起来还是不太一样的。
class Solution
{
public:
void push(int node) {
if (!queue1.empty())
queue1.push(node);
if (!queue2.empty())
queue2.push(node);
if (queue1.empty() && queue2.empty())
queue1.push(node);
}
int pop() {
if (!queue1.empty())
{
while (queue1.size() > 1)
{
int data = queue1.front();
queue1.pop();
queue2.push(data);
}
int res = queue1.front();
queue1.pop();
return res;
}
else if (!queue2.empty())
{
while (queue2.size() > 1)
{
int data = queue2.front();
queue2.pop();
queue1.push(data);
}
int res = queue2.front();
queue2.pop();
return res;
}
}
private:
queue<int> queue1;
queue<int> queue2;
};