leetcode--232:(栈和队列)Implement Queue using Stacks

用两个栈实现队列的思路与方法
博客介绍了用两个栈实现队列的思路和方法。因一个栈无法实现,故建立两个栈s1和s2,用deque实现栈。还列举了栈和队列的可用方法,说明了队列push、pop、peek、empty方法的具体实现方式,最后给出答案的转载链接。

# 2019.7.12:

我的思路:

  很明显,一个栈是做不到的,只能建立两个栈s1和s2。栈的实现可以用deque(题目说的),那就很简单实现了。然后两个栈如何分配呢?我们先看栈能用哪些方法:

  • push(item) 添加一个新的元素item到栈顶
  • pop() 弹出栈顶元素
  • is_empty() 判断栈是否为空
  • size() 返回栈的元素个数(用不到)
  • top()返回栈顶元素

 

  再看队列需要实现的方法:

  1. push(x):把x放入queue尾部--push进s1中

  2. pop():移除队列第一个元素--如果s2为空,把s1的元素全部pop出来再push到s2中,然后s2栈顶就是队列最早进来的元素,pop即可

  3. peek():获取第一个元素--类似pop()

  4. empty():判断队列是否为空--s1和s2同时为空的时候就返回true

 

我的答案:

 

from collections import deque

class Stack:
    def __init__(self):
        self.items = deque()    # 创建一个deque实例

    def push(self, x):
        return self.items.append(x)

    def pop(self):
        return self.items.pop()

    def top(self):
        return self.items[-1]

    def is_empty(self):
        return len(self.items) == 0


class MyQueue:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.s1 = Stack()
        self.s2 = Stack()

    def push(self, x: int) -> None:
        """
        Push element x to the back of queue.
        """
        self.s1.push(x)

    def pop(self) -> int:
        """
        Removes the element from in front of queue and returns that element.
        """
        if self.s2.is_empty():
            while not self.s1.is_empty():
                val = self.s1.pop()
                self.s2.push(val)
        return self.s2.pop()

    def peek(self) -> int:
        """
        Get the front element.
        """
        if self.s2.is_empty():
            while not self.s1.is_empty():
                val = self.s1.pop()
                self.s2.push(val)
        return self.s2.top()

    def empty(self) -> bool:
        """
        Returns whether the queue is empty.
        """
        return self.s1.is_empty() and self.s2.is_empty()

 

 

 

转载于:https://www.cnblogs.com/marvintang1001/p/11175622.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值