用栈去实现队列,栈的特点是后进先出,队列是先进先出,要用栈实现队列,用两个栈。
一个栈接受元素后,此时从栈顶出来的是队列的尾元素,因此再用一个栈来装从栈顶弹出的队列尾部元素,此时栈底存着队尾,栈顶存着队头,实现了队列。
class MyQueue {
Deque<Integer> inStack;
Deque<Integer> outStack;
public MyQueue() {
inStack=new ArrayDeque<Integer>();
outStack=new ArrayDeque<Integer>();
}
public void push(int x) {
inStack.push(x);
}
public int pop() {
if(outStack.isEmpty()){
while(!inStack.isEmpty())
outStack.push(inStack.pop());
}
return outStack.pop();
}
public int peek() {
if(outStack.isEmpty()){
while(!inStack.isEmpty())
outStack.push(inStack.pop());
}
return outStack.peek();
}
public boolean empty() {
if(outStack.isEmpty()){
while(!inStack.isEmpty())
outStack.push(inStack.pop());
}
return outStack.isEmpty();
}
}
说实话,leetcode上要求的是两个队列实现后入先出的栈,队列是先进先出,弹出的是栈底元素放到另外一个队列的队尾,必须得把前面n-1个元素弹到另外一个队列中才能弹出栈顶元素。队列的特性是新元素放到尾部,根本就不需要两个队列这么多,直接队头元素全部弹出陆续再推进队列的尾部,栈顶元素自然就被推到了队头,此时队头自然就是栈顶了。
class MyStack {
Deque <Integer> stack;
public MyStack() {
stack=new ArrayDeque<Integer>();
}
public void push(int x) {
int size=stack.size();
stack.offerLast(x);
for(int i=0;i<size;i++){
stack.offerLast(stack.pollFirst());
}
}
public int pop() {
return stack.pollFirst();
}
public int top() {
return stack.peekFirst();
}
public boolean empty() {
return stack.isEmpty();
}
}