队列是先进先出,栈是后进先出
如何使用队列实现栈?
首先,需要多少个队列?一个肯定是不行的,但是两个就足够了。
分析
假设有队列 q1,q2
初始想法是利用 q2把q1反向,形成后来的在队尾,但是由于队列的方向是固定的,
不论你怎么摆弄,都不可能反向:一个队列出去的,也必定先进入另一个队列——顺序始终不变
现在考虑:不反向,push进去的顺序不要管,只需要关系pop、peek
具体实现:push时只向一个队列添加,维持一个队列为空
-pop时,把当前队列的前size-1个元素放到另一个空队列,本队列清空
-peek时,返把所有元素放到另一个队列,同时返回最后一个,本队列清空
实现
public class TwoQueueAsStack {
private Queue<Integer> q1 ; //q1,q2用于存放元素,保持其中一个为空
private Queue<Integer> q2 ;
private Queue<Integer> cur; //cur和empty指向q1/q2,用户具体的操作
private Queue<Integer> empty;
public TwoQueueAsStack(){
q1 = new LinkedList<>();
q2 = new LinkedList<>();
}
//调整队列,使cur指向q1q2中用于存放元素的队列,empty指向空队列
private void adjust(){
cur =q1.size()==0?q2:q1;
empty=q1.size()==0?q1:q2;
}
public void push(int a){
adjust();
cur.offer(a);
}
public boolean pop(){
adjust();
if (cur.size()==0)return false; //为空
while (cur.size()!=1){
empty.offer(cur.poll());
}
cur.poll();
return true;
}
public int peek(){
adjust();
if (cur.size()==0){
System.out.println("empty");//为空
return -1;
}
while (cur.size()!=1){
empty.offer(cur.poll());
}
int res = cur.poll();
empty.offer(res);
return res;
}
public int size(){
return Math.max(q1.size(),q2.size());
}
public static void main(String[] args) {
TwoQueueAsStack tqa = new TwoQueueAsStack();
tqa.push(1);
tqa.push(2);
tqa.push(3);
System.out.println(tqa.size());
System.out.println(tqa.peek());
tqa.pop();
tqa.pop();
System.out.println(tqa.peek());
System.out.println(tqa.size());
}
}