题目:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回true
;否则,返回false
。
思路一:使用两个队列实现栈。队列是先入先出的,栈是后入先出的,所以要想队列的输出序列与栈的一致,队列的输入序列需要与栈的相逆。一个队列作为主队列,存放弹出顺序与栈的弹出顺序一致的序列。另一个队列作为辅助队列,压入元素时先在此排好序后再放入主队列。
代码:
class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
public MyStack() {
queue1=new LinkedList<>();//主队列,存放弹出顺序与栈的弹出顺序一致的序列
queue2=new LinkedList<>();//辅助队列
}
public void push(int x) {
int size=queue1.size();
queue2.offer(x);//把压入元素先放到辅助队列
while(size>0){//把主队列中排好序的(相当于栈中的元素的逆序序列)元素压入辅助队列中
queue2.offer(queue1.poll());
size--;
}
//此时辅助队列中存放的就是排好序的元素序列,即栈中元素逆序的序列
Queue<Integer> queueTemp=queue1;
queue1=queue2;
queue2=queueTemp;
}
public int pop() {
return queue1.poll();
}
public int top() {
return queue1.peek();
}
public boolean empty() {
return queue1.isEmpty();
}
}
思路二:使用一个队列实现栈。要想实现先压入的元素后弹出 ,只需将队列先压入的size-1个元素弹出再压入。
代码:
class MyStack {
Queue<Integer> queue;
public MyStack() {
queue=new LinkedList<>();
}
public void push(int x) {
queue.offer(x);
int size=queue.size()-1;
while(size>0){
queue.offer(queue.poll());
size--;
}
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.isEmpty();
}
}