大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。
“使用两个队列实现一个后入先出的栈,支持栈的全部四种操作。”
题目链接:
来源:力扣(LeetCode)
链接: 225. 用队列实现栈 - 力扣(LeetCode)
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
注意:
示例 1:
输入:
["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
示例 2:
题意要求使用两个队列实现一个后入先出(LIFO)的栈,并实现栈的全部四种操作(push、top、pop 和 empty)。
栈是后进先出的数据机构,元素从顶端入栈,从顶端出栈。
队列是一种先进先出的数据结构,元素从后端入队,从前端出队。
为了满足栈的特性,也就是后入先出,在实现队列实现栈时,应该满足前端的元素是最后入栈的元素。
用两个队列,其中一个队列用于存储栈内的元素,两一个队列作为入栈操作的辅助队列。
在入栈时,先将元素入队到队列2,然后将队列1的全部元素依次出队并入队到队列2,此时队列2的前端元素即为新入栈的元素,再将队列1和队列2互换,队列1的元素即为栈内的元素,队列1的前端和后端对应栈顶和栈底。
出栈操作,只需要移除队列1的前端元素并返回,获得栈顶元素操作只需要获得队列1的前端元素并返回。
判断是否为空,可以判断队列1是否为空即可。
代码参考:
class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
/** Initialize your data structure here. */
public MyStack() {
queue1 = new LinkedList<Integer>();
queue2 = new LinkedList<Integer>();
}
/** Push element x onto stack. */
public void push(int x) {
queue2.offer(x);
while (!queue1.isEmpty()) {
queue2.offer(queue1.poll());
}
Queue<Integer> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
return queue1.poll();
}
/** Get the top element. */
public int top() {
return queue1.peek();
}
/** Returns whether the stack is empty. */
public boolean empty() {
return queue1.isEmpty();
}
}
时间复杂度:O(n)
入栈操作的时间复杂度为O(n),其中n是栈内元素的个数。
空间复杂度:O(n)
其中n是栈内元素的个数,需要使用两个队列存储栈内的元素。
一个队列为主队列,一个为辅助队列。
当入栈操作时,我们先将主队列内容导入辅助队列,然后将入栈元素放入主队列队头位置,再将辅助队列内容,依次添加进主队列即可。