题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
思路:栈是先进后出,队列是先进先出。
想象我们一直向左边口袋装东西(并且只能向左边装),当我们左边口袋装了很多东西,而右边口袋是空的,想取左边口袋最下面的的东西时,可以把东西全部挪到右边口袋,这样左口袋最下边的东西就暴露在右边口袋最上面,可以直接取走了。这样就实现了先进先出。(pop取东西时,此时左边口袋已空,从右边口袋表面取)
值得注意的是:再次取东西时,直接从右边口袋取,因为顺序已经换过来了,和当初压栈的顺序一样,所以此时再压栈放东西时,直接装左边口袋,直到右边口袋取完了,再想取时,就要重复倒一次,这样就又能保证右边顺序和压栈一致了。(也就是说,弹东西时,栈2为空,就倒一手调整顺序,栈2不为空,就直接弹栈2)
例如压入栈1的顺序是1 2 3时,倒给栈2顺序是3 2 1,而栈2的弹出时的顺序1 2 3,和压入栈1的顺序一致,因此只要保证每次倒一手时,把栈1倒空,栈2的顺序就不会乱。
非常巧妙的一题
import java.util.Stack; public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); public void push(int node) { stack1.push(node);//永远往栈1压元素 } public int pop() { //想取元素 if(stack1.empty()&&stack2.empty()){ throw new RuntimeException("Queue is empty!"); } if(stack2.isEmpty()){ //栈2为空,就需要倒一手,不为空就直接弹,跳到return进行弹 while(!stack1.isEmpty()){ //栈2已经空了想取元素,就得把元素全部倒给栈2,直到栈1是空 stack2.push(stack1.pop()); //把栈1的弹出,全部放入栈2 } } return stack2.pop(); //直到栈1倒一手后为到空时,来到return,此时想取的元素在栈2的栈顶 //或者是之前弹过,再次弹时,也会来return,直接从栈2上面弹。 //因为,想要再次弹出时,顺序其实已经调换过来了,这一点很关键, //想要压栈时,直接向栈1中压,只有在栈2被取空后,再想取时,需要将栈1的元素再次倒给栈2 } }