LeetCode 225. Implement Stack using Queues

简介: 使用队列实现栈的下列操作:push(x) -- 元素 x 入栈;pop() -- 移除栈顶元素;top() -- 获取栈顶元素;empty() -- 返回栈是否为空

v2-445a8954b7e1315c180b461bbfa4b29d_1440w.jpg

Description



Implement the following operations of a stack using queues.

push(x) -- Push element x onto stack.


pop() -- Removes the element on top of the stack.

top() -- Get the top element.


empty() -- Return whether the stack is empty.


Example:


MyStack stack = new MyStack();
stack.push(1);
stack.push(2);
stack.top(); // returns 2
stack.pop(); // returns 2
stack.empty(); // returns false


描述



使用队列实现栈的下列操作:


push(x) -- 元素 x 入栈

pop() -- 移除栈顶元素

top() -- 获取栈顶元素

empty() -- 返回栈是否为空


注意:


你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。

你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。


你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。


思路



  • 我们使用两个队列来模拟栈,一个标记为空队列,一个标记为被填值队列.
  • 当要取栈顶元素的时候,我们将被填值队列的元素取出放到空队列中,使其只剩下一个元素,这个元素就是栈顶元素,同时我们交换指向空队列和被填值队列的引用.
  • 判断是否为空我们只需要检查当前被填值的队列是否为空即可.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2019-01-28 20:21:35
# @Last Modified by:   何睿
# @Last Modified time: 2019-01-28 20:28:10
from collections import deque
class MyStack:
    def __init__(self):
        """
        Initialize your data structure here.
        """
        # 声明两个队列,由于模拟栈
        self.queue1 = deque()
        self.queue2 = deque()
        # self._empty指向当前空的队列
        self._empty = self.queue1
        # self._filled指向当前有填充的队列
        self._filled = self.queue2
    def push(self, x):
        """
        Push element x onto stack.
        :type x: int
        :rtype: void
        """
        # 向有值的队列中添加值
        self._filled.append(x)
    def pop(self):
        """
        Removes the element on top of the stack and returns that element.
        :rtype: int
        """
        # 检查是否有元素
        num = len(self._filled)
        if num == 0: return None
        # 我们从有值的队列中取出元素,使其只剩下一个元素
        for _ in range(num - 1):
            self._empty.append(self._filled.popleft())
        # 弹出剩下的一个元素
        item = self._filled.popleft()
        # 交换指向空队列和被填值队列的引用
        self._empty, self._filled = self._filled, self._empty
        return item
    def top(self):
        """
        Get the top element.
        :rtype: int
        """
        if self.empty(): return None
        return self._filled[-1]
    def empty(self):
        """
        Returns whether the stack is empty.
        :rtype: bool
        """
        return len(self._filled) == 0


源代码文件在这里.


目录
相关文章
|
6月前
|
算法 安全 Java
【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号
【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号
43 0
|
存储 算法 测试技术
从小白开始刷算法 Stack 栈篇 leetcode.496
从小白开始刷算法 Stack 栈篇 leetcode.496
|
算法
从小白开始刷算法 Stack 栈篇 leetcode.20
从小白开始刷算法 Stack 栈篇 leetcode.20
|
存储
LeetCode 232. Implement Queue using Stacks
使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。
78 0
LeetCode 232. Implement Queue using Stacks
Leetcode-Easy 155. Min Stack
Leetcode-Easy 155. Min Stack
96 0
Leetcode-Easy 155. Min Stack
LeetCode 225:用队列实现栈 Implement Stack using Queues
题目: 使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 Implement the following operations of a stack using queues.
1070 0
LeetCode 232:用栈实现队列 Implement Queue using Stacks
题目: 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。
669 0
LeetCode 155:最小栈 Min Stack
LeetCode 155:最小栈 Min Stack 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) -- 将元素 x 推入栈中。 pop() -- 删除栈顶的元素。
802 0
|
算法 Java C语言
LeetCode 28:实现strStr() Implement strStr()
公众号:爱写bug(ID:icodebugs) 作者:爱写bug 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。
699 0