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脚本实现网卡流量监控
Feb 14 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
Dec 25 Python
python基础while循环及if判断的实例讲解
Aug 25 Python
Django model序列化为json的方法示例
Oct 16 Python
selenium在执行phantomjs的API并获取执行结果的方法
Dec 17 Python
python 提取tuple类型值中json格式的key值方法
Dec 31 Python
pycharm配置当鼠标悬停时快速提示方法参数
Jul 31 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
深入了解Python在HDA中的应用
Sep 05 Python
对python中各个response的使用说明
Mar 28 Python
Python如何解除一个装饰器
Aug 07 Python
Django对接elasticsearch实现全文检索的示例代码
Aug 02 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文件读写操作之文件写入代码
2011/01/13 PHP
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
PHP实现清除MySQL死连接的方法
2016/07/23 PHP
JavaScript 无符号右移赋值操作
2009/04/17 Javascript
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
2012/02/03 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
浅谈JavaScript中的String对象常用方法
2015/02/25 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
微信小程序之仿微信漂流瓶实例
2016/12/09 Javascript
AngularJS实现注册表单验证功能
2017/10/16 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
[46:55]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python基于select实现的socket服务器
2016/04/13 Python
python实现kNN算法
2017/12/20 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
Python中pip更新和三方插件安装说明
2018/07/08 Python
widows下安装pycurl并利用pycurl请求https地址的方法
2018/10/15 Python
django为Form生成的label标签添加class方式
2020/05/20 Python
Python CSS选择器爬取京东网商品信息过程解析
2020/06/01 Python
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
马来西亚航空官方网站:Malaysia Airlines
2017/07/28 全球购物
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
个人求职简历的自我评价范文
2013/10/09 职场文书
仓库主管的岗位职责
2013/12/04 职场文书
关于诚信的活动方案
2014/08/18 职场文书
政法干警核心价值观心得体会
2014/09/11 职场文书
教师年度考核个人总结
2015/02/12 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技