力扣-232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push
、pop
、peek
、empty
):
实现 MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾
int pop()
从队列的开头移除并返回元素
int peek()
返回队列开头的元素
boolean empty()
如果队列为空,返回 true
;否则,返回 false
说明:
你 只能 使用标准的栈操作 —— 也就是只有 push to top
, peek/pop from top
, size
, 和 is empty
操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
示例 1:
1 2 3 4 5 6 7 8 9 10 11 12 13 输入: ["MyQueue", "push", "push", "peek", "pop", "empty"] [[], [1], [2], [], [], []] 输出: [null, null, null, 1, 1, false] 解释: MyQueue myQueue = new MyQueue(); myQueue.push(1); // queue is: [1] myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue) myQueue.peek(); // return 1 myQueue.pop(); // return 1, queue is [2] myQueue.empty(); // return false
解题思路 需要两个栈,一个输入栈,一个输出栈。在push数据的时候只需将数据放进输入栈。在pop数据时,若输出栈为空,就把输入栈中的数据全部弹出导入 ,再从输出栈弹出数据。如果输出栈不为空,则直接从输出栈弹出数据即可。如果输入栈和输出栈都为空的话,说明模拟的队列为空了。
代码实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 var MyQueue = function() { this.in = [] this.out = [] }; /** * @param {number} x * @return {void} */ MyQueue.prototype.push = function(x) { this.in.push(x) }; /** * @return {number} */ MyQueue.prototype.pop = function() { if(!this.out.length){ while(this.in.length){ this.out.push(this.in.pop()) } } return this.out.pop() }; /** * @return {number} */ MyQueue.prototype.peek = function() { let peekNum = this.pop() this.out.push(peekNum) return peekNum }; /** * @return {boolean} */ MyQueue.prototype.empty = function() { return !this.in.length && !this.out.length };
力扣-225. 用队列实现栈 请你仅使用两个队列实现一个后入先出(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(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 输入: ["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
解题思路 使用两个队列:队列1用于入栈,队列2用于备份队列1最后一个元素以外的元素。当需要出栈的时候,队列1中最后一个元素以外的元素备份到队列2中(使用一个队列:也可以直接将队列1中最后一个元素以外的元素shift后push到队列1中),接下来弹出(pop)队列1中最后的元素,将队列2中备份的元素重新存储到队列1.
代码实现 使用两个队列 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 var MyStack = function() { this.queue1 = [] this.queue2 = [] }; /** * @param {number} x * @return {void} */ MyStack.prototype.push = function(x) { this.queue1.push(x) }; /** * @return {number} */ MyStack.prototype.pop = function() { let length = this.queue1.length-1 while(length--){ this.queue2.push(this.queue1.shift()) } let popNum = this.queue1.pop() let len = this.queue2.length while(len--){ this.queue1.push(this.queue2.shift()) } return popNum }; /** * @return {number} */ MyStack.prototype.top = function() { let topNum = this.pop() this.queue1.push(topNum) return topNum }; /** * @return {boolean} */ MyStack.prototype.empty = function() { return !this.queue1.length && !this.queue2.length };
使用一个队列 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 var MyStack = function() { this.queue = []; }; /** * Push element x onto stack. * @param {number} x * @return {void} */ MyStack.prototype.push = function(x) { this.queue.push(x); }; /** * Removes the element on top of the stack and returns that element. * @return {number} */ MyStack.prototype.pop = function() { let size = this.queue.length; while(size-- > 1) { this.queue.push(this.queue.shift()); } return this.queue.shift(); }; /** * Get the top element. * @return {number} */ MyStack.prototype.top = function() { const x = this.pop(); this.queue.push(x); return x; }; /** * Returns whether the stack is empty. * @return {boolean} */ MyStack.prototype.empty = function() { return !this.queue.length; };