题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
思路:
栈是先进后出
要实现的是在队尾插入节点
在队首删除节点
首先呢,可以拿一个例子来看,首先通过一个例子来分析,比如插入一个元素a,可以先将它插入到栈1之中。栈1中目前的元素为{a},栈2为空。
再压入两个元素b,c。同上。此时栈1的元素为{a,b,c}。栈2为空。
现在要删除啦。想要删除的元素为队首元素。此时需要把a,b,c放在栈2中,然后删除栈2的栈顶就完成了删除队首的操作啦。
此时栈1为空,栈2为{c,b},b在栈顶
如果想要再次删除的话,剩下的为b,c,需要删除的为b。b在栈顶,直接删除。
此时栈2为{c},栈1为空。
总结可知:
删除一个元素,如果栈2不为空,直接弹出栈2的栈顶。
栈2为空的时候,把栈1的元素依次取出放到栈2中,再删除,即弹出栈顶,如果栈1也为空,则队列为空,无法进行删除操作
添加一个元素,若栈2为空,直接添加到栈1之中即可。
如果栈2有元素,则依次取出再放回栈1,再添加元素即可。
class Solution
{
public:
void push(int node) {
//如果栈2不为空,则取回数字到栈1,再添加元素
while(!stack2.empty()){
stack1.push(stack2.top());
stack2.pop();
}
stack1.push(node);
}
int pop() {
//如果栈1不为空,则取回数字到栈2,再删除元素
while(!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
int t=stack2.top();
stack2.pop();
return t;
}
private:
stack<int> stack1;
stack<int> stack2;
};