时间:2021-05-22
本文实例讲述了Python实现的数据结构与算法之双端队列。分享给大家供大家参考。具体分析如下:
一、概述
双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构。双端队列也拥有两端:队首(front)、队尾(rear),但与队列不同的是,插入操作在两端(队首和队尾)都可以进行,删除操作也一样。
二、ADT
双端队列ADT(抽象数据类型)一般提供以下接口:
① Deque() 创建双端队列
② addFront(item) 向队首插入项
③ addRear(item) 向队尾插入项
④ removeFront() 返回队首的项,并从双端队列中删除该项
⑤ removeRear() 返回队尾的项,并从双端队列中删除该项
⑥ empty() 判断双端队列是否为空
⑦ size() 返回双端队列中项的个数
双端队列操作的示意图如下:
三、Python实现
在Python中,有两种方式可以实现上述的双端队列ADT:使用内建类型list、使用标准库collections.deque(其实collections.deque就是Python中双端队列的标准实现)。
两种方式的不同主要体现在性能上(具体参考 collections.deque | TimeComplexity):
操作|实现方式 list collections.deque-----------------------------------------addFront O(n) O(1)-----------------------------------------addRear O(1) O(1)-----------------------------------------removeFront O(n) O(1)-----------------------------------------removeRear O(1) O(1)1、使用内建类型list
#!/usr/bin/env python# -*- coding: utf-8 -*-class Deque: def __init__(self): self.items = [] def addFront(self, item): self.items.insert(0, item) def addRear(self, item): self.items.append(item) def removeFront(self): return self.items.pop(0) def removeRear(self): return self.items.pop() def empty(self): return self.size() == 0 def size(self): return len(self.items)2、使用标准库collections.deque
#!/usr/bin/env python# -*- coding: utf-8 -*-from collections import dequeclass Deque: def __init__(self): self.items = deque() def addFront(self, item): self.items.appendleft(item) def addRear(self, item): self.items.append(item) def removeFront(self): return self.items.popleft() def removeRear(self): return self.items.pop() def empty(self): return self.size() == 0 def size(self): return len(self.items)四、应用
回文(palindrome)是正读反读都一样的单词或句子,是一种修辞方式和文字游戏。
英文例子:
madam
able was i ere i saw elba
中文例子:
花非花
人人为我、我为人人
如果要实现一个 回文验证算法(验证一个给定的字符串是否为回文),使用Deque类将非常容易:将字符串存储到双端队列,同时取出首尾字符并比较是否相等,只要有一对字符不等,则该字符串不是回文;若全部相等,则该字符串为回文。具体代码如下:
运行结果:
$ python palchecker.py"able was i ere i saw elba" is palindrome"人人为我、我为人人"是回文"What's wrong 怎么啦"不是回文希望本文所述对大家的Python程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了C++数据结构与算法之双缓存队列实现方法。分享给大家供大家参考,具体如下:“双缓存队列”是我在一次开发任务中针对特殊场景设计出来的结构。使用场景为
本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法。分享给大家供大家参考,具体如下:根据维基百科的伪代码实现:广度优先BFS:使用队列,集
java数据结构之栈与队列一:对列队列是一种先进先出的数据结构实现代码:packageQueue;/**使用java构建队列,并模拟实现队列的入队和出对方法*/
本文实例讲述了JS中的算法与数据结构之队列(Queue)。分享给大家供大家参考,具体如下:队列(Queue)我们之前说到了栈,它是一种比较高效的数据结构,遵循先
本文实例讲述了Python数据结构与算法之使用队列解决小猫钓鱼问题。分享给大家供大家参考,具体如下:按照《啊哈》里的思路实现这道题目,但是和结果不一样,我自己用