LeetCode:剑指offer 09:用两个栈实现队列

problem

LeetCode 剑指offer 09:用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

solution

方法一

思路过程

  • 明白栈和队列两种数据结构,栈先进后出,队列先进先出
  • 每一次添加元素,直接放在一个栈的后面
  • 每一次删除元素,把栈的元素pop放到另外一个栈中append,删除中转的栈的栈顶元素,再放回原来的栈中
  • 也可以每次添加元素,用另外一个栈配合放到栈底,每次删除元素就直接出栈,就是看你在来回换的时候放到什么函数中去实现

代码

python

class CQueue:

    def __init__(self):
        # temp作为临时调用的栈
        self.temp = []
        self.queue = []

    def appendTail(self, value: int) -> None:
        self.queue.append(value)

    def deleteHead(self) -> int:
        # 这里真的是傻了,for在in i 循环里面是变化的,就没了
        if self.queue:
            length = len(self.queue)
            for i in range(length):
                self.temp.append(self.queue.pop())
            res = self.temp.pop()
            for i in range(length - 1):
                self.queue.append(self.temp.pop())
            return res
        return -1

优化:

class CQueue:

    def __init__(self):
        # temp作为临时调用的栈
        self.temp = []
        self.queue = []

    def appendTail(self, value: int) -> None:
        self.queue.append(value)

    def deleteHead(self) -> int:
        if self.queue:
            while self.queue:
                self.temp.append(self.queue.pop())
            res = self.temp.pop()
            while self.temp:
                self.queue.append(self.temp.pop())
            return res
        return -1

方法二

思路过程

  • 参考这篇文章☞[双栈,一个负责入,一个负责出],写得很好(https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/solution/xiong-mao-shua-ti-python3-shuang-zhan-yi-ge-fu-ze-/)
    • 两个栈instack 和 outstack,一个用来添加元素,一个用来删除元素
    • 调用添加元素的函数时,直接放到instack 栈顶
    • 调用减少元素的函数时,查看outstack 是否有元素,如果有,就直接pop,没有就查看instack
    • instack有的话,把元素放入outstack,否则返回-1,
  • 这样就避免了每次增加或是删除元素的时候,都要把元素来回倒腾一次,做到了较好的优化,跑起来果然有很大的提升

代码

python

class CQueue:

    def __init__(self):
        self.instack=[]
        self.outstack=[]

    def appendTail(self, value: int) -> None:
        self.instack.append(value)

    def deleteHead(self) -> int:
        if self.outstack:
            return self.outstack.pop()
        if self.instack:
            while self.instack:
                self.outstack.append(self.instack.pop())
            return self.outstack.pop()
        return -1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值