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 相关文章推荐
简单介绍利用TK在Python下进行GUI编程的教程
Apr 13 Python
Python随手笔记之标准类型内建函数
Dec 02 Python
Python的collections模块中namedtuple结构使用示例
Jul 07 Python
Python实现的异步代理爬虫及代理池
Mar 17 Python
使用python遍历指定城市的一周气温
Mar 31 Python
Python使用filetype精确判断文件类型
Jul 02 Python
在python中利用opencv简单做图片比对的方法
Jan 24 Python
使用python将mysql数据库的数据转换为json数据的方法
Jul 01 Python
Python argparse模块应用实例解析
Nov 15 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 Python
python绘制趋势图的示例
Sep 17 Python
python 制作网站小说下载器
Feb 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/08/07 PHP
php正则表达式获取内容所有链接
2015/07/24 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
2015/12/21 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
PHP实现的mongoDB数据库操作类完整实例
2018/04/10 PHP
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
2012/06/14 Javascript
2种jQuery 实现刮刮卡效果
2015/02/01 Javascript
AngularJS模块管理问题的非常规处理方法
2015/04/29 Javascript
Javascript实现的简单右键菜单类
2015/09/23 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
原生js实现分页效果
2020/09/23 Javascript
vue3.0实现插件封装
2020/12/14 Vue.js
[00:37]DOTA2上海特级锦标赛 Secert 战队宣传片
2016/03/03 DOTA
Python自动扫雷实现方法
2015/07/25 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
Python温度转换实例分析
2018/01/17 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/26 Python
python三方库之requests的快速上手
2019/03/04 Python
python调试神器PySnooper的使用
2019/07/03 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
Ancheer官方户外和运动商店:销售电动自行车
2019/08/07 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
任命书范本大全
2014/06/06 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
办公室个人总结
2015/02/28 职场文书
公司董事任命书
2015/09/21 职场文书