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实现爬虫下载美女图片
Jul 14 Python
Python实现简单文本字符串处理的方法
Jan 22 Python
Python3 replace()函数使用方法
Mar 19 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
Oct 15 Python
详解django2中关于时间处理策略
Mar 06 Python
Python3.4解释器用法简单示例
Mar 22 Python
python虚拟环境完美部署教程
Aug 06 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
Aug 21 Python
python实现视频读取和转化图片
Dec 10 Python
Django model重写save方法及update踩坑详解
Jul 27 Python
python MD5加密的示例
Oct 19 Python
人工智能深度学习OpenAI baselines的使用方法
May 20 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性能优化的介绍
2013/06/20 PHP
PHP Echo字符串的连接格式
2016/03/07 PHP
js中格式化日期时间型数据函数代码
2010/11/08 Javascript
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
jQuery+jsp实现省市县三级联动效果(附源码)
2015/12/03 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
2016/02/25 Javascript
node.js实现爬虫教程
2020/08/25 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
2016/08/01 Javascript
移动适配的几种方案(三种方案)
2016/11/25 Javascript
详解jQuery中的DOM操作
2016/12/23 Javascript
BootStrap fileinput.js文件上传组件实例代码
2017/02/20 Javascript
js实现日历与定时器
2017/02/22 Javascript
canvas绘制一个常用的emoji表情
2017/03/30 Javascript
vue-router 组件复用问题详解
2018/01/22 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
2018/08/13 Javascript
详解vue更改头像功能实现
2019/04/28 Javascript
分析python服务器拒绝服务攻击代码
2014/01/16 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
python中wx模块的具体使用方法
2020/05/15 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
基于第一个PhoneGap(cordova)的应用详解
2013/05/03 HTML / CSS
美国最大的购物网站:Amazon.com(亚马逊美国)
2020/05/23 全球购物
国防教育标语
2014/10/08 职场文书
会计工作检讨书
2015/02/19 职场文书
单位综合评价意见
2015/06/05 职场文书
python中filter,map,reduce的作用
2022/06/10 Python