1.队列
队列是尾进头出,所以下面的出队顺序是1234,如果后面再进567 出队的顺序是1234567
2.栈
栈是后进先出,结合这一特点,我们可以用两个栈模拟一个队列。用一个栈来push,然后把他pop到另一个栈里面,按照栈后进先出的特点,pop完后会形成右面那幅图。如下图
此时将右面那幅图输出。就形成了队列的出队顺序。(注意的是每次把栈1pop到栈2前,一定要确保栈2是空的,否则就一直pop栈2,知道它空才能再把栈1pop到栈2)如果没有保证栈2pop空了,就将栈1pop到栈2,会像下图一样:
3.代码
public class StackQueue {
private Stack<Integer> s1;
private Stack<Integer> s2;
public StackQueue() {
this.s1 = new Stack();
this.s2 = new Stack();
}
public void push(int val){
s1.push(val);
}
public int poll(){
if(s1.empty()&&s2.empty())throw new RuntimeException("队列为空");//如果两个栈都空,队列为空,抛异常
if(!s2.empty()) return s2.pop();
else while(!s1.empty()) s2.push(s1.pop());
return s2.pop();
}
public static void main(String[] args) {
StackQueue s = new StackQueue();
for (int i = 0; i < 5; i++) {
s.push(i);
}
System.out.println(s.poll());//0
for (int i = 5; i < 10; i++) {
s.push(i);
}
for (int i = 0; i < 10; i++) {
System.out.print(s.poll());//123456789 java.lang.RuntimeException: 队列为空
}
}
}