• 数据结构----双端队列Dque


    双端队列的概念与数据结构

      deque(也称为双端队列)是与队列类似的项的有序集合。它有两个端部,首部和尾部,并且项在集合中保持不变。

      deque 特殊之处在于添加和删除项是非限制性的。可以在前面或后面添加新项。同样,可以从任一端移除现有项。在某种意义上,这种混合线性结构提供了单个数据结构中的栈和队列的所有能力。  

    Deque的抽象数据类型定义:Deque的抽象数据类型应该由以下结构和操作定义。其中元素可以从首部或尾部的任一端添加和移除。Deque操作如下
    • Dque() 创建一个空的新 deque。它不需要参数,并返回空的 deque。
    • lpush(item) 将一个新项添加到 deque 的首部。它需要 item 参数 并不返回任何内容。
    • rpush(item) 将一个新项添加到 deque 的尾部。它需要 item 参数并不返回任何内容。
    • lpop() 从 deque 中删除首项。它不需要参数并返回 item。deque 被修改。
    • rpop() 从 deque 中删除尾项。它不需要参数并返回 item。deque 被修改。
    • isEmpty() 测试 deque 是否为空。它不需要参数,并返回布尔值。
    • size() 返回 deque 中的项数。它不需要参数,并返回一个整数。  

    双端队列的定义  

      

     1 class Deque(object):
     2     def __init__(self):
     3         self.deque = []
     4 
     5     def __str__(self):
     6         return str(self.deque)
     7 
     8     def rpush(self, item):
     9         self.deque.append(item)
    10 
    11     def lpush(self, item):
    12         self.deque.insert(0, item)
    13 
    14     def rpop(self):
    15         return self.deque.pop() if self.deque else "Dequeue is empty!"
    16 
    17     def lpop(self):
    18         return self.deque.pop(0) if self.deque else "Dequeue is empty!"
    19 
    20     def isEmpty(self):
    21         return self.deque == []
    22 
    23     def size(self):
    24         return len(self.deque)

    Deque的应用案例-回文检查

    回文检测:设计程序,检测一个字符串是否为回文。

    - 回文:回文是一个字符串,读取首尾相同的字符,例如,radar toot madam

    - 分析:该问题的解决方案将使用 deque 来存储字符串的字符。我们从左到右处理字符串,并将每个字符添加到 deque 的尾部。在这一点上,deque 像一个普通的队列。然而,我们现在可以利用 deque 的双重功能。 deque 的首部保存字符串的第一个字符,deque 的尾部保存最后一个字符。我们可以直接删除并比较首尾字符,只有当它们匹配时才继续。如果可以持续匹配首尾字符,我们最终要么用完字符,要么留出大小为 1 的deque,取决于原始字符串的长度是偶数还是奇数。在任一情况下,字符串都是回文。

     1 from basic.deque import Deque
     2 
     3 def palchecker(aString):
     4     chardeque = Deque()
     5 
     6     for ch in aString:
     7         chardeque.addRear(ch)
     8 
     9     stillEqual = True
    10 
    11     while chardeque.size() > 1 and stillEqual:
    12         first = chardeque.removeFront()
    13         last = chardeque.removeRear()
    14         if first != last:
    15             stillEqual = False
    16 
    17     return stillEqual
    18 
    19 print(palchecker("lsdkjfskf"))
    20 print(palchecker("radar"))
    双端队列解决回文字符串
  • 相关阅读:
    通信专业术语解释
    STM32F10系列管脚设置
    [笔试题]使用回调函数编写冒泡排序,可以排序整形数组,也可以排序字符串
    Date常用转换、比较
    哈希映射
    APP技巧格式
    $.get/$.post/$.ajax/$.getJSON
    使用Rss框架PHP开发流程
    测试rss与navicat连接
    验证码技术
  • 原文地址:https://www.cnblogs.com/open-yang/p/11367019.html
Copyright © 2020-2023  润新知