题目
使用队列实现栈的下列操作:
push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() – 获取栈顶元素 empty() – 返回栈是否为空
-
两个队列模拟栈
一个队列负责进数据,另一个队列当做临时备份的作用,把除了需要弹出的元素之外的其他所有元素暂时备份到队列2,等队列1把元素弹出后,再将队列2中的元素重新放回到队列1。 -
优化:一个队列模拟栈
一个队列在模拟栈弹出元素的时候,只要不断的将队列头部的元素(除了最后一个元素外)一个一个重新添加到队列尾部,此时再弹出元素就是栈的顺序了。
java代码如下(一个队列实现)
class MyStack {
Deque<Integer> que;//双端队列Deque继承了Queue的接口,所以Queue中的add、poll、peek等效于Deque中的addLast、pollFirst、peekFirst
//初始化
public MyStack(){
que = new ArrayDeque<>();
}
//元素 x 入栈
public void push(int x){
que.addLast(x);
}
//移除栈顶元素
public int pop(){
int size = que.size();
size--;
//将队列头部中除了最后一个元素之外的元素,全部一个一个添加到队尾
while(size-- > 0){//操作队列的元素-1次,以保留最后一个元素
que.addLast(que.peekFirst());//每次获取队列的队头元素并添加到队尾中
que.pollFirst();//然后移除这个队头元素(因为已经添加到队尾了)
}
int res = que.pollFirst();
return res;
}
//获取栈顶元素
public int top() {
return que.peekLast();//栈顶相当于队尾
}
//返回栈是否为空
public boolean empty() {
return que.isEmpty();
}
}