普通队列、双端队列的原理详解及其python实现

一、原理详解

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。

队列是一种先进先出的(First In First Out)的线性表,简称FIFO
允许插入的一端为队尾,允许删除的一端为队头。队列不允许在中间部位进行操作!
假设队列是q=(a1,a2,……,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,总是在队列最后。
(注意区分:栈是后进先出LIFO

二、python实现

队列除了先进先出的的特点与栈不同,在其他地方的语法上与栈相差无几。
像上文栈的原理详解与python实现那样,我们依旧选用list来实现队列。

(一)、普通队列

1、python实现

class Queue(object):
    def __init__(self):
        # 初始化一个空队列
        self.items = []

    def is_empty(self):
        # 判断是否为空
        return len(self.items) == 0

    def push(self, item):
        # 队列是先进先出
        # 入队
        self.items.append(item)

    def pop(self):
        # 出队
        self.items.pop(0)  # 注意与栈的区别 这个是从头部出,所以pop(0)

    def size(self):
        # 返回队列长度
        return len(self.items)

    def travel(self):
        # 遍历
        for i in self.items:
            print(i, end=' ')
        print('')

2、代码测试

if __name__ == '__main__':
    # 初始化一个队列对象
    q = Queue()
    print(q.is_empty())
    for i in range(5):
        q.push(i)
    q.travel()      # 打印出0-5
    print("size:", q.size())
    q.pop()
    q.pop()     # 进行2次出队的操作,讲道理是前两个元素即0和1出去了,现在遍历应该是只有后三个元素即2 3 4
    print("size:", q.size())
    q.travel()

执行结果为:
在这里插入图片描述

(二)、双端队列

双端队列可以在两端进行操作,即可以在头部插入和删除,也可以在尾部进行插入和删除。而普通队列只能在头部删除、尾部插入。
所以双端队列和普通队列相比主要是多了头部插入和尾部删除这两个功能。因此可以在原有队列的代码的基础上加以改进。
在这里插入图片描述

1、Python代码实现

class Queue(object):
    def __init__(self):
        # 初始化一个空队列
        self.items = []

    def is_empty(self):
        # 判断是否为空
        return len(self.items) == 0

    # 将原来的push、pop两个函数改为了一下四个函数
    # 分别用于实现头部插入、尾部插入、头部删除、尾部删除
    def push_front(self, item):
        self.items.insert(0, item)

    def push_back(self, item):
        self.items.append(item)

    def remove_front(self):
        self.items.pop(0)

    def remove_back(self):
        self.items.pop()

    def size(self):
        # 返回队列长度
        return len(self.items)

    def travel(self):
        # 遍历
        for i in self.items:
            print(i, end=' ')
        print('')

2、测试代码

if __name__ == '__main__':
    # 初始化一个队列对象
    q = Queue()
    print(q.is_empty())
    for i in range(5):
        q.push_front(i)
    q.travel()      # 打印出0-5
    print("size:", q.size())
    q.remove_front()
    q.remove_front()     # 进行2次出队的操作
    print("size:", q.size())
    q.travel()

执行结果如下:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值