【leetcode 232】【用栈实现队列】

该博客讨论了如何利用两个栈实现队列的基本操作,包括push、pop、peek和empty。在push时,元素进入输入栈;在pop和peek时,如果输出栈为空,则将输入栈所有元素转移到输出栈,然后进行操作。代码实现中,时间复杂度为O(n)(入队),空间复杂度为O(n)(入队)。
摘要由CSDN通过智能技术生成

leetcode232用栈实现队列

示例:

使用栈实现队列的下列操作:
push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。

解题思路:

栈是先进后出,队列是先入先出,为了实现队列的逻辑,那么需要两个栈。一个是输入栈,一个是输出栈。输入栈用于存放push进来的元素,当要进行pop或者peek操作时,需要把输入栈内容全部转移到输出栈中,此时顺序就正确了,可以对输出栈进行pop和peek操作。而empty操作是判断输入栈和输出栈是否为空。 输出栈非空时,禁止压入元素。必须一次性全部压入,否则一旦积压,最终的出栈顺序将被打乱

代码思路:

  1. 初始化两个数组作为栈
  2. push操作把数据放入输入栈a
  3. pop和peak操作类似,只是一个要把元素拿出来,一个是不需要拿出来。

代码:

class MyQueue:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.stack_a = []
        self.stack_b = []


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

    def pop(self) -> int:
        """
        Removes the element from in front of queue and returns that element.
        """
        if self.empty():
            return None
       
        if self.stack_b:  #b不是空的
            return self.stack_b.pop()
        else:
            len_a = len(self.stack_a)
            while len_a:
            	self.stack_b.append(self.stack_a.pop()) #这里用的pop是内置的pop
                len_a -=1
        	return self.stack_b.pop()


    def peek(self) -> int:
        """
        Get the front element.
        """
        if self.empty():
            return None
        
        if self.stack_b:
            return self.stack_b[-1]
        else:
            len_a = len(self.stack_a)
            while len_a:
                self.stack_b.append(self.stack_a.pop())
                len_a -=1
            return self.stack_b[-1]


    def empty(self) -> bool:
        """
        Returns whether the queue is empty.
        """
        return not self.stack_a and not self.stack_b
        



# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()
复 杂 度 分 析 : \color{red}{复杂度分析:}

入队时间复杂度:O(n)
对于除了新元素之外的所有元素,它们都会被压入两次,弹出两次。新元素只被压入一次,弹出一次。这个过程产生了 4n + 2 次操作,其中 n 是队列的大小。由于 压入 操作和 弹出 操作的时间复杂度为 O(1), 所以时间复杂度为 O(n)。

入队空间复杂度:O(n)
需要额外的内存来存储队列中的元素。

出队和peak和判断为空:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值