Python实现的数据结构与算法之双端队列详解


Posted in Python onApril 22, 2015

本文实例讲述了Python实现的数据结构与算法之双端队列。分享给大家供大家参考。具体分析如下:

一、概述

双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构。双端队列也拥有两端:队首(front)、队尾(rear),但与队列不同的是,插入操作在两端(队首和队尾)都可以进行,删除操作也一样。

二、ADT

双端队列ADT(抽象数据类型)一般提供以下接口:

① Deque() 创建双端队列
② addFront(item) 向队首插入项
③ addRear(item) 向队尾插入项
④ removeFront() 返回队首的项,并从双端队列中删除该项
⑤ removeRear() 返回队尾的项,并从双端队列中删除该项
⑥ empty() 判断双端队列是否为空
⑦ size() 返回双端队列中项的个数

双端队列操作的示意图如下:

Python实现的数据结构与算法之双端队列详解

三、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 deque
class 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类将非常容易:将字符串存储到双端队列,同时取出首尾字符并比较是否相等,只要有一对字符不等,则该字符串不是回文;若全部相等,则该字符串为回文。具体代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def palchecker(aString):
  chardeque = Deque()
  for ch in aString:
    chardeque.addRear(ch)
  while chardeque.size() > 1:
    first = chardeque.removeFront()
    last = chardeque.removeRear()
    if first != last:
      return False
  return True
if __name__ == '__main__':
  str1 = 'able was i ere i saw elba'
  print('"%s" is%s palindrome' % (str1, '' if palchecker(str1) else ' not'))
  str2 = u'人人为我、我为人人'
  print(u'"%s"%s是回文' % (str2, u'' if palchecker(str2) else u'不'))
  str3 = u"What's wrong 怎么啦"
  print(u'"%s"%s是回文' % (str3, u'' if palchecker(str3) else u'不'))

运行结果:

$ python palchecker.py
"able was i ere i saw elba" is palindrome
"人人为我、我为人人"是回文
"What's wrong 怎么啦"不是回文

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python enumerate遍历数组示例应用
Sep 06 Python
Python实现上下班抢个顺风单脚本
Feb 07 Python
对Python中DataFrame选择某列值为XX的行实例详解
Jan 29 Python
Python编写合并字典并实现敏感目录的小脚本
Feb 26 Python
使用Python中的reduce()函数求积的实例
Jun 28 Python
Python 运行.py文件和交互式运行代码的区别详解
Jul 02 Python
python实现布隆过滤器及原理解析
Dec 08 Python
Python3+Selenium+Chrome实现自动填写WPS表单
Feb 12 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
May 22 Python
查看keras的默认backend实现方式
Jun 19 Python
利用Python批量识别电子账单数据的方法
Feb 08 Python
pytorch 如何使用amp进行混合精度训练
May 24 Python
Python实现的数据结构与算法之队列详解
Apr 22 #Python
详尽讲述用Python的Django框架测试驱动开发的教程
Apr 22 #Python
Hadoop中的Python框架的使用指南
Apr 22 #Python
Python实现提取文章摘要的方法
Apr 21 #Python
python中map、any、all函数用法分析
Apr 21 #Python
用于统计项目中代码总行数的Python脚本分享
Apr 21 #Python
Python中实现参数类型检查的简单方法
Apr 21 #Python
You might like
PHP开发文件系统实例讲解
2006/10/09 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
PHP7.0版本备注
2015/07/23 PHP
PHP附件下载中文名称乱码的解决方法
2015/12/17 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
setAttribute 与 class冲突解决
2008/02/17 Javascript
通过js动态操作table(新增,删除相关列信息)
2012/05/23 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
跟我学Node.js(四)---Node.js的模块载入方式与机制
2014/06/04 Javascript
使用jquery.validate自定义方法实现"手机号码或者固话至少填写一个"的逻辑验证
2014/09/01 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
Javascript验证方法大全
2015/09/21 Javascript
Jquery ajax基础教程
2015/11/20 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
jQuery实现的选择商品飞入文本框动画效果完整实例
2016/08/10 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
微信小程序 POST请求的实例详解
2017/09/29 Javascript
JavaScript的数据类型转换原则(干货)
2018/03/15 Javascript
微信小程序实现顶部导航特效
2019/01/28 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
[01:52]PWL S2开团时刻第四期——DOTA2成语故事
2020/12/03 DOTA
python去除所有html标签的方法
2015/05/05 Python
浅谈在JupyterNotebook下导入自己的模块的问题
2020/04/16 Python
python中return如何写
2020/06/18 Python
PHP高级工程师面试问题推荐
2013/01/18 面试题
大学新生军训个人的自我评价
2013/10/03 职场文书
超越自我演讲稿
2014/05/21 职场文书
十佳青年事迹材料
2014/08/21 职场文书
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android
React如何使用axios请求数据并把数据渲染到组件
2022/08/05 Javascript