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

栈和队列其实也是一种解题思想,和哈希表一样,都是一种思想(而非数据结构)。

理论基础

1、最常见的就是借助列表来实现:

就是一个单出口的瓶子:后放进去的先出来;

队列就是排队,先进去先出来。都是对数据的一种整理方式,而不是数据结构。

常涉及的列表的函数:

①append:在列表最后添加一个元素

②pop():弹出列表的最后一个元素

③pop(0):弹出列表的第一个元素

也就是说:①②一起用是栈,①③一起用是队列

在用栈实现队列时,由于是list,如果用pop(0)的话,每次pop(0)都需要后面的每个元素都移动位置,因此时间复杂度较高。所以一般选择用两个栈来实现队列,即用第二个stack来实现倒序。(见232的pop函数部分)

2、也可以用双向队列deque来实现:

Python中,如果用deque的话要先:

from collections import deque

常涉及的deque的函数:

①append:在deque最后添加一个元素

②pop():弹出deque的最后一个元素

③popleft():弹出deque的第一个元素(和list的不同)

也就是说:①②一起用是栈,①③一起用是队列

232.用栈实现队列

class MyQueue:

    def __init__(self):
        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:#在之前已经进行了pop(0)操作
            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()#调用pop函数,弹出stack_out的最后一个元素,也就是队列头的第一个元素
        self.stack_out.append(ans)#再把ans方慧stack_out,以保持队列不变
        return ans


    def empty(self) -> bool:
        return not (self.stack_in or self.stack_out)#要求in和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()

不知道为啥pop函数的else部分用while写不行,非常奇怪

注意提前判断栈为空的情况

225. 用队列实现栈

from collections import deque
class MyStack:

    def __init__(self):
        self.deque_in = deque()

    def push(self, x: int) -> None:
        self.deque_in.append(x)

    def pop(self) -> int:
        return self.deque_in.pop()#deque是双向队列,pop是从右边弹出,popleft从左边弹出(数据从左至右存储)

    def top(self) -> int:
        if self.empty():
            return None
        else:
            ans = self.deque_in[-1]#查询deque的最后一个元素
            return ans

    def empty(self) -> bool:
        return len(self.deque_in)==0



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

Python的deque是双向队列,pop是从右边弹出,popleft从左边弹出(数据从左至右存储)

这俩题想着理论完全简单,怎么都做这么久!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值