题目描述:
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
- void push(int x) 将元素 x 压入栈顶。
- int pop() 移除并返回栈顶元素。
- int top() 返回栈顶元素。
- boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
注意: - 你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
- 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可
示例:
输入:
[“MyStack”, “push”, “push”, “top”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]
解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False
题目链接:
https://leetcode-cn.com/problems/implement-stack-using-queues/
我们都知道栈的特性是先进后出,而队列的特性是先进先出,那怎么样才能用队列实现一个栈呢?
其实我们可以使用两个队列实现出一个栈来,原理是什么呢?
就是开始的时候指定一个队列(假如是队列1)来添加数据.
假如遇到top(),我们将当前队列1的前n-1个数据放入到另一个队列2中,然后用一个变量保存第一个队列中最后一个数据,然后将它加入队列2,返回这个变量值即可.
**假如遇到poll()**我们将当前队列1的前n-1个数据放入到另一个队列2中,然后直接poll队列1的最后一个即可.
如此反复交换执行就可以完成一个栈的实现.
话不多少直接上代码
class MyStack {
/** Initialize your data structure here. */
Queue<Integer> q1;
Queue<Integer> q2;
public MyStack() {
//构造器中维护两个队列
q1 = new LinkedList<>();
q2 = new LinkedList<>();
}
/** Push element x onto stack. */
public void push(int x) {
if(q1.isEmpty() && q2.isEmpty()){
q1.offer(x);
}else if(q1.isEmpty()){
q2.offer(x);
}else{
q1.offer(x);
}
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
if(empty()){
return -1;
}
if(q2.isEmpty()){
while(q1.size()> 1){
q2.offer(q1.poll());
}
return q1.poll();
}
else{
while(q2.size()> 1){
q1.offer(q2.poll());
}
return q2.poll();
}
}
/** Get the top element. */
public int top() {
if(empty()){
return -1;
}
if(q2.isEmpty()){
while(q1.size()> 1){
q2.offer(q1.poll());
}
int temp = q1.poll();
q2.offer(temp);
return temp;
}
else{
while(q2.size()> 1){
q1.offer(q2.poll());
}
int temp = q2.poll();
q1.offer(temp);
return temp;
}
}
/** Returns whether the stack is empty. */
public boolean empty() {
//若两个都是空的话证明栈为空了
return q1.isEmpty()&&q2.isEmpty();
}
}