本文所解决的问题是如何用队列来实现栈
我们采用双队列的思想,这两个队列地位是一致的,当栈非空时,一定是一个队列为空,另一个队列非空。当进行入栈操作时,我们找到非空队列,在该队列添加元素;当进行出栈操作时,我们同样找到非空队列,将该非空队列除队尾元素外的其余元素添加到另一队列,然后让队尾元素出队。
class MyStack {
Queue<Integer>queue1;
Queue<Integer>queue2;
/** Initialize your data structure here. */
public MyStack() {
queue1=new LinkedList<>();
queue2=new LinkedList<>();
}
/** 入栈操作 */
public void push(int x) {
Queue<Integer>queue=queue1.isEmpty()?queue2:queue1;
queue.add(x);
}
/** 出栈操作 */
public int pop() {
if(queue1.isEmpty()&&queue2.isEmpty()){
throw new RuntimeException("栈空");
}
Queue<Integer>queue_pop=queue1.isEmpty()?queue2:queue1;
Queue<Integer>queue_store=queue1.isEmpty()?queue1:queue2;
while (queue_pop.size()!=1){
queue_store.add(queue_pop.poll());
}
return queue_pop.poll();
}
/** 返回栈顶元素 */
public int top() {
if(queue1.isEmpty()&&queue2.isEmpty()){
throw new RuntimeException("栈空");
}
Queue<Integer>queue_pop=queue1.isEmpty()?queue2:queue1;
Queue<Integer>queue_store=queue1.isEmpty()?queue1:queue2;
while (queue_pop.size()!=1){
queue_store.add(queue_pop.poll());
}
int peek=queue_pop.peek();
queue_store.add(queue_pop.poll());
return peek;
}
/** 判断栈是否为空 */
public boolean empty() {
return queue1.isEmpty()&&queue2.isEmpty();
}
}