用两个栈实现队列
题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
解题思路
栈的特点:先进后出
队列的特点:后进先出
实例说明
假设将元素 a ,插入到stack1中,此时 stack1 中的元素有{a},stack2 中为空,再向 stack1 中插入元素 b, c,此时stack1 中的元素有{a, b , c},stack2 中为空,如下图所示:
如果现在要删除一个元素,按照队列先进先出的特点,a 是最先插入到队列中,那么就用该删除元素 a 。但是元素 a 现在存在 stack1中,由于栈是先进后出,此时栈顶元素为 c ,所以不能直接删除元素 a ,已知没有用到的stack2 终于要派上用场了。
如果将 stack1 中的元素弹出并压入到 satck2 中,我们可以发现 stack2 中的元素顺序正好与 stack1 中元素的顺序相反,如下图所示:
此时元素 a 处于 stack2 的栈顶,可以直接删除。将元素 a 删除后,下一个进出队列的元素是 b,= ,此时元素 b 正好处于 stack2 的栈顶,可以直接删除。
通过上面的这个例子,我们可以总结出:
当 stack2 不为空时,在 stack2 中的栈顶元素是最先进入队列中的元素,可以直接删除;当 stack2 为空时,将 stack1 中的元素逐个弹出并压入 stack2 中,经过这些操作, stack1 中最低端的元素会处于 stack2 的栈顶,这样就可以直接删除。
再来讨论一下插入元素的问题,栈与队列的插入元素的操作时一样的,可以直接插入到 stack1 中,可能有人会有一个疑惑,例如下面这个例子:
若现在要删除一个元素,此时 stack2 中不为空,说明先删除 stack2 中的元素 c ,而不是删除元素 d ,不过元素 c 确实在元素 d 之前插入,那么先删除的应该是元素 c 。
代码实现
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
if(stack2.size() <= 0)
{
while(stack1.size() > 0)
{
int data = stack1.top();
stack1.pop();
stack2.push(data);
}
}
int head = stack2.top();
stack2.pop();
return head;
}
private:
stack<int> stack1;
stack<int> stack2;
};