1.栈
栈是后进先出
2.队列
我们现在想用两个队列来第一个输出4怎么办,大家很容易就想到按照下图的方法把队列中的123移到另一个队列,然后第一个队列只剩一个值4,pop这个值就行了。
当最后一个4pop后,你会发现此时队列1又为空了。所以编程的时候要注意
- 无论是push前后,还是pop前后,其中一个队列一定是空的就像上图。
- push的时候往非空的队列push
- pop的时候将非空的队列poll到空队列,剩下一个直接pop。(两个队列pop的时候轮流为空)
3.代码
public class QueueStack {
private Queue<Integer> q1 ;
private Queue<Integer> q2 ;
public QueueStack() {
this.q1 = new LinkedList();
this.q2 = new LinkedList();
}
public void offer(int val){
if(!q1.isEmpty())q1.offer(val);
else q2.offer(val);
}
public int pop(){
int val=0;
if(q1.isEmpty()&&q2.isEmpty())throw new RuntimeException("栈为空");
if(!q1.isEmpty()){
while(q1.size()>1)q2.offer(q1.poll());
val = q1.poll();//此时q2poll的是最后一个元素
} else{
while(q2.size()>1)q1.offer(q2.poll());
val=q2.poll();//此时q1poll的是最后一个元素
}
return val;
}
public static void main(String[] args) {
QueueStack s = new QueueStack();
for (int i = 0; i < 5; i++) {
s.offer(i);
}
for (int i = 0; i < 5; i++) {
System.out.print(s.pop());//43210
}
System.out.println(s.pop());//java.lang.RuntimeException: 栈为空
}
}