两个栈实现队列
栈的特性是先进后出(FILO),队列的特性是先进先出(FIFO)。
解题思路:
用一个栈(栈a)来模拟入队,另一个栈(栈b)来模拟出队过程。
入队过程:直接把元素压入栈a中。
出队过程:当栈b为空时,讲栈a中的元素出栈并以此压入栈b中,然后依次出栈。
假设现有三个元素:3,4,5,用两个栈来模拟队列。
刚开始,将3,4压入栈a中(入队列),此时的情况为:栈a:{3,4},栈b:{空}。
然后马上将栈a的元素压入栈b中,此时的情况变为:栈a:{空},栈b:{4,3}。
还有最后一个元素5,将它压入栈a中(入队列),此时的情况为:栈a:{5},栈b:{4,3}。
此题的关键在于,当栈b为空时才可将栈a的元素压入。
此时正确的操作应为:栈b的3,4出栈(出队列),等栈空了以后,5再由栈a入栈b,最后5出栈b(出队列)。
而如果5在栈b弹出元素3后就压入栈b,此时4还在栈b中,5进来后4就被“压在下面”了,最终栈b的弹出顺序变成:3,5,4。所以,栈b为空时才可压入栈a里的元素。
java代码:
public class Solution {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
stack1.push(node);
}
public int pop() {
if (stack2.empty()) {
while (!stack1.empty()) {
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
}