(Python3)数据结构——03.双端队列的原理及实现

前言

  • 有python基础
  • 学过数据结构自然是最好的

原理

  • 双端队列是在队列的基础上进行改进的。关于队列的博客链接:
https://blog.youkuaiyun.com/sf9898/article/details/104941655
  • 灵魂画手,凑合着看吧

在这里插入图片描述

  • 和队列的区别正如名称中所说的,双端队列可以在两端进行操作,即可以在头部插入和删除,也可以在尾部进行插入和删除。和队列的差别主要是差了在头部插入和尾部删除两个点。因此可以在原有队列的代码的基础上加以改进。

实现

初始化

  • 共同点:初始化的时候依然是空的
class Deque(object):
    def __init__(self):
        self.items = []

判空/遍历/size

  • 判空、遍历、size等函数继续沿用
    def isEmpty(self):
        return len(self.items) == 0

    def size(self):
        return len(self.items)

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

增加元素和删除元素

  • 原来队列的插入和删除的函数改下名字,之后再增加普通队列没有的
    def pushBack(self, item):
        self.items.append(item)

    def removeFront(self):
        self.items.pop(0)
  • 加上新的内容,从尾部删除可以直接用pop()删除items的最后一个元素,在头部添加,可以用insert的方法
 	def removeBack(self):
        self.items.pop()

    def pushFront(self, item):
        self.items.insert(0, item)

完整代码

  • 最后做下测试,以下是完整代码
class Deque(object):
    def __init__(self):
        self.items = []

    def isEmpty(self):
        return len(self.items) == 0

    def size(self):
        return len(self.items)

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

    # 双端队列可以在队列的头部和尾部两端进行操作
    # 故两端都可以进行增加和删除的操作
    # 在原来的队列的基础上进行改进即可得到
    # 原来的队列的增加是在尾部增加,删除是在头部
    def pushBack(self, item):
        self.items.append(item)

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

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

    def pushFront(self, item):
        self.items.insert(0, item)


dq = Deque()
print(dq.isEmpty())
# 下面进行5次的尾部插入,预期结果是0,1,2,3,4
for i in range(5):
    dq.pushBack(i)
dq.travel()
# 进行头部插入,预期结果是9,8,7,6,0,1,2,3,4
for i in range(6, 10):
    dq.pushFront(i)
dq.travel()
# 接下来验证删除操作
# 先删除尾部的三个元素,预期结果是9,8,7,6,0,1
for i in range(3):
    dq.removeBack()
dq.travel()
# 再删除头部的4个元素,预期结果是0,1
for i in range(4):
    dq.removeFront()
dq.travel()
  • 结果

在这里插入图片描述

  • 虽说双端队列看起来是比栈和队列灵活,但是实际应用中并不如队列和栈实在。
### 使用 `collections.deque` 实现特异性双端队列 Python 提供了一个内置模块 `collections`,其中包含了 `deque` 类来高效地实现双端队列操作。对于特定的双端队列需求,可以利用此功能创建并管理队列。 #### 初始化与基本操作 为了满足题目中的要求——即先处理输入,读取 n 值以及随后的 2n 行操作指令,并使用一个队列结构存储数据以模拟双端队列的行为[^1]: ```python from collections import deque def process_operations(n, operations): queue = deque() for op in operations: if 'head add' in op: _, value = op.split(' ') queue.appendleft(int(value)) elif 'remove tail' in op or 'remove' in op: if queue: queue.pop() elif 'tail add' in op: _, value = op.split(' ') queue.append(int(value)) return list(queue) # 示例调用函数 n = 3 operations = [ "head add 1", "remove tail", "tail add 2", "head add 3", "remove", "remove" ] result = process_operations(n, operations) print(result) # 输出剩余元素 ``` 这段代码展示了如何解析给定的操作序列,并按照指定的方式更新双端队列的内容。当遇到移除命令时,如果队列不为空,则执行相应的删除动作;而对于添加命令,则依据是从头还是尾部加入新元素来进行适当的位置插入[^3]。 #### 处理不同类型的添加指令 根据描述,在接下来的 2n 行中有 n 行涉及添加数据的具体形式:“head add x”表示从头部添加,“tail add x”则意味着从尾部追加数值 x 到队列中。上述代码片段已经考虑到了这两种情况下的具体实现方式。 #### 测试实例验证 考虑到具体的测试案例,比如提供的第一个测试样例及其预期输出结果为 “1”,可以通过上面定义好的方法轻松重现这一过程并得到相同的结果[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值