队列特性是先入先出,栈特性是先入后出,栈实现队列需要两个栈来实现,队列实现栈也需要两个对立来实现。
1.栈实现队列
public class TwoStacksQueue{
private Stack<Integer> stackPush;
private Stack<Integer> stackPop;
public TwoStacksQueue() {
this.stackPush = new Stack<>();
this.stackPop = new Stack<>();
}
public void push(int pushInt) {
stackPush.push(pushInt);
}
public int poll() {
if(stackPop.empty() && stackPush.empty()) {
throw new RuntimeException("Queue is empty!");
}else if(stackPop.empty()) {
while(!stackPush.empty()) {
stackPop.push(stackPush.pop());
}
}
return stackPop.pop();
}
public int peek() {
if(stackPop.empty() && stackPush.empty()) {
throw new RuntimeException("Queue is empty!");
}else if(stackPop.empty()) {
while(!stackPush.empty()) {
stackPop.push(stackPush.pop());
}
}
return stackPop.peek();
}
}
2.队列实现栈
public static class TwoQueuesStack{
private Queue<Integer> queue;
private Queue<Integer> help;
public TwoQueuesStack() {
this.queue = new LinkedList<>();
this.help = new LinkedList<>();
}
public void push(int pushInt) {
queue.add(pushInt);
}
public int peek() {
if(queue.isEmpty()) {
throw new RuntimeException("Stack is Empty!");
}
while(queue.size() != 1) {
help.add(queue.poll());
}
int res = queue.poll();
help.add(res);
swap();
return res;
}
public int pop() {
if(queue.isEmpty()) {
throw new RuntimeException("Stack is empty!");
}
while(queue.size() > 1) {
help.add(queue.poll());
}
int res = queue.poll();
swap();
return res;
}
private void swap() {
Queue<Integer> tmp = this.help;
this.help = this.queue;
this.queue = tmp;
}
}