剑指offer-用两个栈实现一个队列
题目:用两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
思路:睡前再来水一题,很好理解,一个栈中的数据恰好与队列中的数据顺序是反的,所以再加一个栈,让数据从第一个栈先传到第二个栈,再传出去,此时顺序就对了。算法整体思路是元素先依次进入栈1,再从栈1依次弹出到栈2,然后弹出栈2顶部的元素,整个过程就是一个队列的先进先出
但是在交换元素的时候需要判断两个栈的元素情况:
“进队列时”,队列中是还还有元素,若有,说明栈2中的元素不为空,此时就先将栈2的元素倒回到栈1 中,保持在“进队列状态”。
“出队列时”,将栈1的元素全部弹到栈2中,保持在“出队列状态”。
所以要做的判断是,进时,栈2是否为空,不为空,则栈2元素倒回到栈1,出时,将栈1元素全部弹到栈2中,直到栈1为空。
代码:
1 import java.util.Stack; 2 public class Solution { 3 Stack<Integer> stack1 = new Stack<Integer>(); 4 Stack<Integer> stack2 = new Stack<Integer>(); 5 6 public void push(int node) { 7 stack1.push(node); 8 } 9 10 public int pop() { 11 if(stack1.isEmpty()&&stack2.isEmpty()){ 12 throw new RuntimeException("Queue is empty!"); 13 } 14 if(stack2.isEmpty()){ //注意此处条件,只有栈2为空时才进行添加,不为空的时候不能添加 15 while(!stack1.isEmpty()){ 16 stack2.push(stack1.pop()); 17 } 18 } 19 return stack2.pop(); 20 } 21 }