232.用栈实现队列
232.用栈实现队列
思路:
栈的特点是 先进后出,而队列的特点是 先进先出。
使用两个栈,由于栈入栈顺序与队列的出队顺序是 相反的.所以,栈1负责入队,出队时将栈1的元素全部入栈到 栈2。此时,栈2的出栈顺序就是 队列的 出队的顺序。
代码:
public class LC232_MyQueue {
Deque<Integer> st1;
Deque<Integer> st2;
public LC232_MyQueue() {
st1 = new ArrayDeque<>();
st2 = new ArrayDeque<>();
}
public void push(int x) {
st1.addFirst(x);
}
public int pop() {
if (!st2.isEmpty()) {
return st2.pollFirst();
} else {
while (!st1.isEmpty()) {
st2.addFirst(st1.pollFirst());
}
return st2.pollFirst();
}
}
public int peek() {
int res = this.pop(); // 代码直接服用pop()
st2.addFirst(res);
return res;
}
public boolean empty() {
return st1.isEmpty() && st2.isEmpty();
}
}
225. 用队列实现栈
思路:
使用两个队列,一个队列负责入栈,每次出栈时,将队列1中的元素,除最后一个元素外,全部移动到队列2,弹出最后一个元素,再将队列1的引用重新指向队列2(即互换),继续队列1负责入栈。
或者
使用一个队列,每次pop时,将第一个元素之后的元素全部出队入队,即将第一个元素之后的元素依次移动到第一个元素后面。
代码:
public class LC225_MyStack {
Deque<Integer> que;
public LC225_MyStack() {
que = new ArrayDeque<>();
}
public void push(int x) {
que.offerFirst(x);
}
public int pop() {
int size = que.size();
for (int i = 0; i < size - 1; i++) {
que.offerFirst(que.pollLast());
}
return que.pollLast();
}
public int top() {
return que.peekFirst();
}
public boolean empty() {
return que.isEmpty();
}
}
Java中的双端队列,Deque已经完全兼容了队列和栈的特性,所以直接使用Deque更方便一些。