Python - 代码随想录算法训练营第十天 | 理论基础、232.用栈实现队列、225. 用队列实现栈

本文介绍了如何用Python中的栈实现队列的功能,包括push、pop、peek和empty操作,并提供了相应的MyQueue和MyStack类的代码实例。同时,还探讨了如何用队列实现栈,展示了另一种解决方案。
摘要由CSDN通过智能技术生成


Python - 代码随想录算法训练营第十天 | 理论基础、232.用栈实现队列、225. 用队列实现栈


前言

开始队列和栈啦


理论基础

队列是先进先出,栈是先进后出。
emmm 这两句就足够了
在这里插入图片描述

232.用栈实现队列

题目链接

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

push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。

示例:

MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek();  // 返回 1
queue.pop();   // 返回 1
queue.empty(); // 返回 false

思路:

1、输入:比较简单,可以用s.append()解决
2、输出:因为栈和列表输出的顺序是刚好相反的,因此,用两个栈倒一下,就可以实习队列的输出。
3、返回首元素:可以复用上面的输出。但是输出是把元素弹出来了,所以用完再把那个元素装回去。
4、判空: 只要两个列表都没有元素则为空。

代码如下:

class MyQueue:

    def __init__(self):
        # stack_in :push
        # stack_out :pop
        self.stack_in = []
        self.stack_out = []
    def push(self, x: int) -> None:
        self.stack_in.append(x)
    def pop(self) -> int:
        if  self.empty():
            return None
        
        if self.stack_out:
            return self.stack_out.pop()
        else:
            for i in range(len(self.stack_in)):
                self.stack_out.append(self.stack_in.pop())
            return self.stack_out.pop()

    def peek(self) -> int:
        ans = self.pop()  #复用此处的代码
        self.stack_out.append(ans)
        return ans
        
    def empty(self) -> bool:
        # 只要in或者out有元素,说明队列不为空
        return not(self.stack_in or self.stack_out)



# 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()

225. 用队列实现栈

题目链接

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

push(x) – 元素 x 入栈
pop() – 移除栈顶元素
top() – 获取栈顶元素
empty() – 返回栈是否为空
注意:

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

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

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

思路:

类似栈那样,用两个队列来实现也可以。有更巧妙的方法,用一个队列实现栈。
这部分主要是写输出的代码。我们希望每次把队列前面的内容放出去存起来,然后弹出最后一个元素。
基于此,我们可以把队列前面的内容逐个重新存进队列,此时队列最前面的就是我们想弹出最后一个元素 !

代码如下:

class MyStack:

    def __init__(self):
        self.que = deque()
        
    def push(self, x: int) -> None:
        self.que.append(x)


    def pop(self) -> int:
        if self.empty():
            return None
        if self.que:
            return self.que.pop()
        else:
            #把除了最后一个,前面的元素重新存进去
            for i in range(len(self.que())-1):
                self.que.append(self.que.pop())
            return self.que.pop()

    def top(self) -> int:
        if self.empty():
            return None
        return self.que[-1]

    def empty(self) -> bool:
        return not self.que



# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()

总结

  1. 待改进:今天的内容掌握的还可以

  2. 收获 :s[-1] ,指取出最后一个元素

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值