题目描述
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
示例
提交的代码
方法一:
import java.util.Deque;
import java.util.LinkedList;
class MyStack {
Deque<Integer> inQueue;
Deque<Integer> outQueue;
public MyStack() {
inQueue=new LinkedList<>();
outQueue=new LinkedList<>();
}
public void push(int x) {
inQueue.offerLast(x);
}
public int pop() {
dumpQueue();
return outQueue.pollFirst();
}
public int top() {
dumpQueue();
return outQueue.peekFirst();
}
public boolean empty() {
return inQueue.isEmpty()&&outQueue.isEmpty();
}
public void dumpQueue(){
if(inQueue.isEmpty())return;
while(!inQueue.isEmpty()){
outQueue.offerFirst(inQueue.pollFirst());
}
}
}
实现的思想和上一篇实现栈的思想类似。只不过dumpQueue方法和dumpStack方法中判断空的逻辑变了一些。
方法二
import java.util.Queue;
import java.util.LinkedList;
class MyStack {
Queue<Integer> mainQueue;
Queue<Integer> auxQueue;
public MyStack() {
mainQueue=new LinkedList<>();
auxQueue=new LinkedList<>();
}
public void push(int x) {
while(!mainQueue.isEmpty()){
auxQueue.offer(mainQueue.poll());
}
mainQueue.offer(x);
while(!auxQueue.isEmpty()){
mainQueue.offer(auxQueue.poll());
}
}
public int pop() {
return mainQueue.poll();
}
public int top() {
return mainQueue.peek();
}
public boolean empty() {
return mainQueue.isEmpty();
}
}
实现的思想就是主队列来模拟栈(倒着的),当offer元素时,先将主队列的元素出队依次添加到辅助队列的末尾,保持次序不变,然后将新添加的元素添加到主队列的尾部(此时队列为空,也是头部),然后再将辅助队列依次出队并加入主队列的后面。
学习到的东西
本来还想找一下jdk官方对于Queue实现的,但是发现有个Deque(Double end queue)这个类既可以做栈又可以做队列,和Queue的操作类似,不过加了个first和last而已(offerFirst,offerLast,pollFirst,pollLast,peekFirst,peekLast)。