【LeetCode刷题】NO.29---第225题

204 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一.题目

225. 用队列实现栈 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。 实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。 注意:
  • 你只能使用队列的基本操作 —— 也就是 push to backpeek/pop from frontsize 和 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

提示:

  • 1 <= x <= 9
  • 最多调用100 次 pushpoptop 和 empty
  • 每次调用 pop 和 top 都保证栈不为空

二、思路分析:

首先这道题目跟用栈形成队列的思想基本查不多,栈形成队列需要两个栈一个扮演入栈的角色一个扮演出战的角色,而本题目中用队列实现栈比上面的要简单的多,因为只需要另外一个队列做辅助队列即可。

每次元素入栈后,首先将元素推入第一个创建的队列中即可完成入栈操作,而对于出栈操作,我们需要将第一个队列的元素除了最后一个全部出队到辅助队列中去,然后再仅剩一个元素的队列中实现出队即可,后续辅助队列的元素需要再次推入第一个队列中去。

三、代码:

var MyStack = function () {
    this.list1 = []
    this.list2 = []
};

/** 
 * @param {number} x
 * @return {void}
 */
MyStack.prototype.push = function (x) {
    this.list1.push(x)
};

/**
 * @return {number}
 */
MyStack.prototype.pop = function () {
    while (this.list1.length > 1) {
        this.list2.push(this.list1.shift())
    }
    let ans = this.list1.shift()
    while (this.list2.length) {
        this.list1.push(this.list2.shift())
    }
    return ans
};

/**
 * @return {number}
 */
MyStack.prototype.top = function () {
    return this.list1[this.list1.length-1]
};

/**
 * @return {boolean}
 */
MyStack.prototype.empty = function () {
    return !this.list1.length && !this.list2.length
};

四、总结:

总的来说,不管是用栈实现队列,还是用队列实现栈的操作,思路都是比较简单的,即利用两个栈或者两个队列辅助完成即可。