【python】Stack / Queue

系统 1540 0

https://www.bilibili.com/video/av53583801/?p=32
学习笔记

文章目录

  • 1 Stack
  • 2 Queue
  • 3 Double-End Queue

1 Stack

【python】Stack / Queue_第1张图片
栈只是一个容器,数据存储形式不局限于某一种,比如顺序表、链表都可以,只要满足 FILO(First in Last out)。为了方便,我们这里采用顺序表的形式实现栈,因为 python 的 list 就可以当顺序表用!

            
              
                class
              
              
                Stack
              
              
                (
              
              
                object
              
              
                )
              
              
                :
              
              
                "栈"
              
              
                def
              
              
                __init__
              
              
                (
              
              self
              
                )
              
              
                :
              
              
        self
              
                .
              
              __list 
              
                =
              
              
                [
              
              
                ]
              
              
                # 用列表,也即顺序表的数据存储方式
              
              
                def
              
              
                is_empty
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                "判断栈是否为空,空返回True"
              
              
                return
              
               self
              
                .
              
              __list 
              
                ==
              
              
                [
              
              
                ]
              
              
                def
              
              
                size
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                "求栈元素的个数"
              
              
                return
              
              
                len
              
              
                (
              
              self
              
                .
              
              __list
              
                )
              
              
                def
              
              
                push
              
              
                (
              
              self
              
                ,
              
              item
              
                )
              
              
                :
              
              
                "进栈"
              
              
        self
              
                .
              
              __list
              
                .
              
              append
              
                (
              
              item
              
                )
              
              
                #这里选择在尾巴上加,复杂度 o(1),如果用insert在头上加复杂度为o(n)
              
              
                def
              
              
                peek
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                "返回栈顶元素"
              
              
                if
              
               self
              
                .
              
              is_empty
              
                (
              
              
                )
              
              
                :
              
              
                return
              
              
                None
              
              
                else
              
              
                :
              
              
                return
              
               self
              
                .
              
              __list
              
                [
              
              
                -
              
              
                1
              
              
                ]
              
              
                def
              
              
                pop
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                "出栈"
              
              
                if
              
               self
              
                .
              
              is_empty
              
                (
              
              
                )
              
              
                :
              
              
                return
              
              
                None
              
              
                else
              
              
                :
              
              
                return
              
               self
              
                .
              
              __list
              
                .
              
              pop
              
                (
              
              
                )
              
              
                if
              
               __name__ 
              
                ==
              
              
                "__main__"
              
              
                :
              
              
    s 
              
                =
              
               Stack
              
                (
              
              
                )
              
              
                print
              
              
                (
              
              
                "empty:"
              
              
                ,
              
              s
              
                .
              
              is_empty
              
                (
              
              
                )
              
              
                )
              
              
    s
              
                .
              
              push
              
                (
              
              
                1
              
              
                )
              
              
    s
              
                .
              
              push
              
                (
              
              
                2
              
              
                )
              
              
    s
              
                .
              
              push
              
                (
              
              
                3
              
              
                )
              
              
    s
              
                .
              
              push
              
                (
              
              
                4
              
              
                )
              
              
                print
              
              
                (
              
              
                "empty:"
              
              
                ,
              
              s
              
                .
              
              is_empty
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              
                "size:"
              
              
                ,
              
              s
              
                .
              
              size
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              
                "peek:"
              
              
                ,
              
              s
              
                .
              
              peek
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              s
              
                .
              
              pop
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              s
              
                .
              
              pop
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              s
              
                .
              
              pop
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              s
              
                .
              
              pop
              
                (
              
              
                )
              
              
                )
              
            
          

output

            
              empty
              
                :
              
              
                True
              
              
empty
              
                :
              
              
                False
              
              
size
              
                :
              
              
                4
              
              
peek
              
                :
              
              
                4
              
              
                4
              
              
                3
              
              
                2
              
              
                1
              
            
          

2 Queue

用 list 实现的话,如果 头入O(n)尾出O(1) ,和 尾入O(1)头出O(n) ,复杂度都是 O(n)!这个时候要根据实际操作来选择合适的写法,比如你是经常入队列的话,建议用 尾入O(1)头出O(n) ,如果你是经常出队列的话,就 头入O(n)尾出O(1)

【python】Stack / Queue_第2张图片

            
              
                class
              
              
                Queue
              
              
                (
              
              
                object
              
              
                )
              
              
                :
              
              
                "队列"
              
              
                def
              
              
                __init__
              
              
                (
              
              self
              
                )
              
              
                :
              
              
        self
              
                .
              
              __list 
              
                =
              
              
                [
              
              
                ]
              
              
                # 用列表,也即顺序表的数据存储方式
              
              
                def
              
              
                is_empty
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                "是否为空"
              
              
                return
              
               self
              
                .
              
              __list
              
                ==
              
              
                [
              
              
                ]
              
              
                def
              
              
                enqueue
              
              
                (
              
              self
              
                ,
              
              item
              
                )
              
              
                :
              
              
                "入队列"
              
              
        self
              
                .
              
              __list
              
                .
              
              append
              
                (
              
              item
              
                )
              
              
                def
              
              
                dequeue
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                "出队列"
              
              
                if
              
               self
              
                .
              
              is_empty
              
                (
              
              
                )
              
              
                :
              
              
                return
              
              
                None
              
              
                else
              
              
                :
              
              
                return
              
               self
              
                .
              
              __list
              
                .
              
              pop
              
                (
              
              
                0
              
              
                )
              
              
                def
              
              
                size
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                "求队列的长度"
              
              
                return
              
              
                len
              
              
                (
              
              self
              
                .
              
              __list
              
                )
              
              
                def
              
              
                peek
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                "查看队首元素"
              
              
                if
              
               self
              
                .
              
              is_empty
              
                (
              
              
                )
              
              
                :
              
              
                return
              
              
                None
              
              
                else
              
              
                :
              
              
                return
              
               self
              
                .
              
              __list
              
                [
              
              
                0
              
              
                ]
              
              
                if
              
               __name__ 
              
                ==
              
              
                "__main__"
              
              
                :
              
              
    q 
              
                =
              
               Queue
              
                (
              
              
                )
              
              
                print
              
              
                (
              
              
                "empty:"
              
              
                ,
              
              q
              
                .
              
              is_empty
              
                (
              
              
                )
              
              
                )
              
              
    q
              
                .
              
              enqueue
              
                (
              
              
                1
              
              
                )
              
              
    q
              
                .
              
              enqueue
              
                (
              
              
                2
              
              
                )
              
              
    q
              
                .
              
              enqueue
              
                (
              
              
                3
              
              
                )
              
              
    q
              
                .
              
              enqueue
              
                (
              
              
                4
              
              
                )
              
              
                print
              
              
                (
              
              
                "empty:"
              
              
                ,
              
              q
              
                .
              
              is_empty
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              
                "size:"
              
              
                ,
              
              q
              
                .
              
              size
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              
                "peek:"
              
              
                ,
              
              q
              
                .
              
              peek
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              q
              
                .
              
              dequeue
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              q
              
                .
              
              dequeue
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              q
              
                .
              
              dequeue
              
                (
              
              
                )
              
              
                )
              
              
                print
              
              
                (
              
              q
              
                .
              
              dequeue
              
                (
              
              
                )
              
              
                )
              
            
          

output

            
              empty
              
                :
              
              
                True
              
              
empty
              
                :
              
              
                False
              
              
size
              
                :
              
              
                4
              
              
peek
              
                :
              
              
                1
              
              
                1
              
              
                2
              
              
                3
              
              
                4
              
            
          

3 Double-End Queue

在这里插入图片描述
和队列的区别就是,头部可入可出,尾部可入可出!我们实现的时候头部指的是 list 下标为 0 的地方!当然你也可以让 list 的最后一个元素是头部!

            
              
                class
              
              
                DeQueue
              
              
                (
              
              
                object
              
              
                )
              
              
                :
              
              
                "双端队列"
              
              
                def
              
              
                __init__
              
              
                (
              
              self
              
                )
              
              
                :
              
              
        self
              
                .
              
              __list 
              
                =
              
              
                [
              
              
                ]
              
              
                # 用列表,也即顺序表的数据存储方式
              
              
                def
              
              
                is_empty
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                "是否为空"
              
              
                return
              
               self
              
                .
              
              __list
              
                ==
              
              
                [
              
              
                ]
              
              
                def
              
              
                add_front
              
              
                (
              
              self
              
                ,
              
              item
              
                )
              
              
                :
              
              
                "头入队列"
              
              
        self
              
                .
              
              __list
              
                .
              
              insert
              
                (
              
              
                0
              
              
                ,
              
              item
              
                )
              
              
                def
              
              
                add_rear
              
              
                (
              
              self
              
                ,
              
              item
              
                )
              
              
                :
              
              
                "尾入队列"
              
              
        self
              
                .
              
              __list
              
                .
              
              append
              
                (
              
              item
              
                )
              
              
                def
              
              
                pop_front
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                "头出队列"
              
              
                if
              
               self
              
                .
              
              is_empty
              
                (
              
              
                )
              
              
                :
              
              
                return
              
              
                None
              
              
                else
              
              
                :
              
              
                return
              
               self
              
                .
              
              __list
              
                .
              
              pop
              
                (
              
              
                0
              
              
                )
              
              
                def
              
              
                pop_rear
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                "尾出队列"
              
              
                if
              
               self
              
                .
              
              is_empty
              
                (
              
              
                )
              
              
                :
              
              
                return
              
              
                None
              
              
                else
              
              
                :
              
              
                return
              
               self
              
                .
              
              __list
              
                .
              
              pop
              
                (
              
              
                )
              
              
                def
              
              
                size
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                "求队列的长度"
              
              
                return
              
              
                len
              
              
                (
              
              self
              
                .
              
              __list
              
                )
              
              
                def
              
              
                peek
              
              
                (
              
              self
              
                )
              
              
                :
              
              
                "查看队首元素"
              
              
                if
              
               self
              
                .
              
              is_empty
              
                (
              
              
                )
              
              
                :
              
              
                return
              
              
                None
              
              
                else
              
              
                :
              
              
                return
              
               self
              
                .
              
              __list
              
                [
              
              
                0
              
              
                ]
              
            
          

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论