前置知识
Deque是一个双端队列接口,继承自Queue接口,Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。Deque的方法方便易用,在做栈或队列的题目时建议用Deque解答。
Deque常用操作:
题目
使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
- void push(int x) 将元素 x 推到队列的末尾
- int pop() 从队列的开头移除并返回元素
- int peek() 返回队列开头的元素
- boolean empty() 如果队列为空,返回 true ;否则,返回 false
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)
思路:
一个栈stackIn模拟进队,一个栈stackOut模拟出队
- 实现push():直接在 stackIn push
- 实现pop():判断 stackOut 是否为空。 1)不为空则 stackOut.pop()。2)为空则先把 stackIn 的元素都导入到 stackOut 中,再 stackOut.pop()
- 实现peek():判断 stackOut 是否为空。 1)不为空则 stackOut.peek()。2)为空则先把 stackIn 的元素都导入到 stackOut 中,再 stackOut.peek()
- 实现isEmpty():stackIn 和 stackOut 都为空。
代码:
class MyQueue {
private Deque<Integer> stackIn;
private Deque<Integer> stackOut;
public MyQueue() {
this.stackIn = new LinkedList<>();
this.stackOut = new LinkedList<>();
}
public void push(int x) {
this.stackIn.offerFirst(x);
}
public int pop() {
if(stackOut.isEmpty()){
while(!stackIn.isEmpty()){
this.stackOut.offerFirst(this.stackIn.pollFirst());
}
}
return this.stackOut.pollFirst();
}
public int peek() {
if(stackOut.isEmpty()){
while(!stackIn.isEmpty()){
this.stackOut.offerFirst(this.stackIn.pollFirst());
}
}
return this.stackOut.peek();
}
public boolean empty() {
return this.stackIn.isEmpty()&&this.stackOut.isEmpty();
}
}
思路:
其实用一个队列就可以模拟堆栈。
- 实现push():直接在 deque 尾部添加元素
- 实现pop():将最后一个元素前面的所有元素依次出队入队,将最后一个元素弹出。
- 实现peek():将最后一个元素前面的所有元素依次出队入队,返回最后一个元素。
- 实现isEmpty():deque为空。
题目
使用两个队列实现先入后出堆栈。堆栈应当支持一般堆栈支持的所有操作(push、pop、peek、empty):
实现 MyStack类:
- void push(int x) 将元素 x 推到队列的末尾
- int pop() 从队列的开头移除并返回元素
- int peek() 返回队列开头的元素
- boolean empty() 如果队列为空,返回 true ;否则,返回 false
假设所有操作都是有效的 (例如,一个空的堆栈不会调用 pop 或者 peek 操作)
class MyStack {
private Deque<Integer> deque;
public MyStack() {
this.deque = new LinkedList<>();
}
public void push(int x) {
this.deque.offerLast(x);
}
public int pop() {
for(int i=0;i<this.deque.size()-1;i++){
this.deque.offerLast(this.deque.pollFirst());
}
return this.deque.pollFirst();
}
public int top() {
for(int i=0;i<this.deque.size()-1;i++){
this.deque.offerLast(this.deque.pollFirst());
}
Integer result = this.deque.pollFirst();
this.deque.offerLast(result);
return result;
}
public boolean empty() {
return this.deque.isEmpty();
}
}