跳至主要內容

225, 用队列实现栈

Mike大约 2 分钟stack/queueeasystackqueuedesign

一、题目描述

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppopempty)。

实现MyStack类:

  • void push(int x)将元素x压入栈顶。
  • int pop()移除并返回栈顶元素。
  • int top()返回栈顶元素。
  • boolean empty()如果栈是空的,返回true;否则,返回false

注意:

  • 你只能使用队列的基本操作 —— 也就是push to backpeek/pop from frontsizeis empty这些操作。
  • 你所使用的语言也许不支持队列。你可以使用list(列表)或者deque(双端队列)来模拟一个队列,只要是标准的队列操作即可。

示例 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

提示

  • 1 <= x <= 9
  • 最多调用100pushpoptopempty
  • 每次调用poptop都保证栈不为空

进阶
你能否仅用一个队列来实现栈。

相关主题

  • 设计
  • 队列

二、题解

方法 1: 两个队列

pub struct MyStack {
    q1: VecDeque<i32>,
    q2: VecDeque<i32>,
}

impl MyStack {
    pub fn new() -> Self {
        MyStack {
            q1: VecDeque::new(),
            q2: VecDeque::new(),
        }
    }

    /// Time Complexity: O(n)
    ///
    /// Space Complexity: O(n)
    pub fn push(&mut self, x: i32) {
        self.q2.push_back(x);

        while let Some(val) = self.q1.pop_front() {
            self.q2.push_back(val);
        }

        std::mem::swap(&mut self.q1, &mut self.q2);
    }

    /// Time Complexity: O(1)
    ///
    /// Space Complexity: O(1)
    pub fn pop(&mut self) -> i32 {
        self.q1.pop_front().unwrap()
    }

    /// Time Complexity: O(1)
    ///
    /// Space Complexity: O(1)
    pub fn top(&mut self) -> i32 {
        *self.q1.front().unwrap()
    }

    /// Time Complexity: O(1)
    ///
    /// Space Complexity: O(1)
    pub fn empty(&self) -> bool {
        self.q1.is_empty()
    }
}

方法 2: 一个队列

pub struct MyStack {
    q1: VecDeque<i32>,
}

impl MyStack {
    pub fn new() -> Self {
        MyStack {
            q1: VecDeque::new(),
        }
    }

    /// Time Complexity: O(n)
    ///
    /// Space Complexity: O(n)
    pub fn push(&mut self, x: i32) {
        let mut len = self.q1.len();
        self.q1.push_back(x);

        while len != 0 {
            if let Some(val) = self.q1.pop_front() {
                self.q1.push_back(val);
            }
            len -= 1;
        }
    }

    /// Time Complexity: O(1)
    ///
    /// Space Complexity: O(1)
    pub fn pop(&mut self) -> i32 {
        self.q1.pop_front().unwrap()
    }

    /// Time Complexity: O(1)
    ///
    /// Space Complexity: O(1)
    pub fn top(&mut self) -> i32 {
        *self.q1.front().unwrap()
    }

    /// Time Complexity: O(1)
    ///
    /// Space Complexity: O(1)
    pub fn empty(&self) -> bool {
        self.q1.is_empty()
    }
}