算法训练记录day10

一、理论基础

栈:先进后出

队列:先进先出

二、用栈实现队列

题目

思路

pop.()函数 : 删除最后一个元素

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 len(self.stack_out)==0:      # 如果out为空,将in中的所有元素追加到out中
            while len(self.stack_in)!=0:    # 只有in中元素不为空
                self.stack_out.append(self.stack_in.pop())   # 将in中的所有元素追加到out中
        return self.stack_out.pop() # 删除并返回队列开头元素

    def peek(self) -> int:
        if len(self.stack_out)==0:      # 如果out为空,将in中的所有元素追加到out中
            while len(self.stack_in)!=0:    # 只有in中元素不为空
                self.stack_out.append(self.stack_in.pop())   # 将in中的所有元素追加到out中
        return self.stack_out[-1]           #  只返回不删除
    def empty(self) -> bool:
        if len(self.stack_in) == 0 and len(self.stack_out) == 0:
            return True
        return False

三、用队列实现栈

题目

思路

class MyStack:

    def __init__(self):
        self.stack = deque()            # 创造两个双端队列
        self.help = deque()


    def push(self, x: int) -> None:        # 增加元素
        self.stack.append(x)

    def pop(self) -> int:       # 删除并获取栈顶元素
        while len(self.stack)>1:    # 只要stack中有1个以上的元素
            self.help.append(self.stack.popleft())  # 把stack中左侧的元素删除并添加到help中,循环   
        tem = self.stack.popleft()      # 不加到help  删除stack中的元素(只有一个)
        self.stack,self.help = self.help,self.stack      #交换位置,使得help为空,stack被删一个元素
        return tem
    def top(self) -> int:         # 只获取,不删除
        while len(self.stack)>1:
            self.help.append(self.stack.popleft())
        tem = self.stack.popleft()
        self.help.append(tem)       # 加到help 没有删除 。help中有tem。
        self.stack,self.help = self.help,self.stack        
        return tem

    def empty(self) -> bool:
        if len(self.stack)==0 and  len(self.help)==0:
            return True
        return False
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值