- 问题描述:
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
- 解法分析:
首先题目要求用两个栈实现一个队列,那么就要先分析为什么这么做。队列的特点就像排队的“先到先得”一样,即先入队的就先出队;而栈则正好相反,特点是“后进先出”,那么问题来了怎么用“后进先出”的得到“先进先出”?
传说中最简单通用但效率不高的方法(其实我还真没想到这么做)是,入队的时候用stack1来存储,当出队的时候,先把stack1的所有元素倒入stack2中,这个过程正好把先进入stack1的元素,变成了后进入stack2的元素;再从stack2中出栈,而此时出栈的也就是先进入stack1的元素了(即先进队的元素)。当出队操作结束的时候,再把stack2的元素倒回stack1,变回原来的顺序。
细思极恐啊,这个方法确实简单无脑,可问题在于当栈内元素很多的时候,出入栈的操作次数变得极其多。
就在我打算在网上找一个图想贴过来的时候看到了一个面试官的总结,感觉受益匪浅:用两个栈实现一个队列——我作为面试官的小结
直接贴code了:
class Solution
{
public:
void push(int node) {
stack1.push(node);
}
int pop() {
int value = 0;
if(!stack2.empty()){
value = stack2.top();
stack2.pop();
}
else{
while(!stack1.empty()){
int temp = stack1.top();
stack1.pop();
stack2.push(temp);
}
value = stack2.top();
stack2.pop();
}
return value;
}
private:
stack<int> stack1;
stack<int> stack2;
};
其实code中还有一个问题,就是当队列为空时,如果执行pop操作,返回值为0。
晚来天欲雪,能饮一杯无?