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

# 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