代码随想录算法训练营day10|232.用栈实现队列、225. 用队列实现栈

232.用栈实现队列 

题目链接/文章讲解/视频讲解:代码随想录

队列是先进先出,栈是先进后出

使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈和输出栈的关系。

在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。

在代码实现的时候,会发现pop() 和 peek()两个函数功能类似,代码实现上也是类似的,要思考一下如何把代码抽象出来。

1.代码复现

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:
        #出栈要判断stack_out是否为空,如果为空,要把stack_in中的元素全部放入stack_out中,再出栈
        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:
        与pop()函数有重复的地方,要会复用
        result = self.pop()
        self.stack_out.append(result)
        return result

    def empty(self) -> bool:
        if self.stack_in and self.stack_out:
            return True
        else:
            return False

初始化定义的时候,一定要写self.stack_in 以及self.stack_out,这样这个栈才能在后序定义的函数里操作。

2.复杂度分析
入队self.push()                                                                                                                          时间复杂度O(1),直接把元素append到stack_in栈中的最后就行;                                                  空间复杂度O(1),stack_in 栈多储存一个元素;

出队self.pop()                                                                                                                                时间复杂度O(N),需要把所有元素全部压入stack_out栈中,再出栈一个元素;                                空间复杂度O(N)需要额外的N个内存来储存队列中的元素;

取队首元素self.peek()                                                                                                                    因为需要调用self.pop(),然后再push,时间复杂度O(N);空间复杂度O(N);                         

判断空self.empty()                                                                                                                      只需要判断两个栈是否为空即可,时间复杂度O(1),空间复杂度O(1)

参考文献

225. 用队列实现栈

题目链接/文章讲解/视频讲解:代码随想录

队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后出的顺序,队列模拟栈的时候只需要一个队列就能实现。

具体的Python实现注意事项:                                                                                                   1.Python普通的Queue或SimpleQueue没有类似于peek的功能,也无法用索引访问,在实现top的时候较为困难;                                                                                                              2.用list可以,但是在使用pop(0)的时候时间复杂度为O(n);
因此这里使用双向队列,我们保证只执行popleft()和append(),因为deque可以用索引访问,可以实现和peek相似的功能。
 

 代码实现

class MyStack:

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

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

    def pop(self) -> int:
        if self.empty():
            return None

        for i in range(len(self.queue)-1):
            self.queue.append(self.queue.popleft())
        return self.queue.popleft()

    def top(self) -> int:
        res = self.pop()
        self.queue.append(res)
        return res

    def empty(self) -> bool:
        if self.queue:
            return False
        else:
            return True

思考:

对于deque()自己之前是完全不了解的。deque实现了两端都可以操作的队列,相当于双端队列。具体deque()的用法参考了如下文章:文章icon-default.png?t=N7T8https://blog.csdn.net/weixin_43790276/article/details/107749745?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170584468416800213065923%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170584468416800213065923&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-107749745-null-null.142%5Ev99%5Epc_search_result_base7&utm_term=python%20deque&spm=1018.2226.3001.4187

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值