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 opencv实现任意角度的透视变换实例代码
Jan 12 Python
python使用turtle库绘制树
Jun 25 Python
在python中将list分段并保存为array类型的方法
Jul 15 Python
python对常见数据类型的遍历解析
Aug 27 Python
基于Python+Appium实现京东双十一自动领金币功能
Oct 31 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
Apr 26 Python
Python类及获取对象属性方法解析
Jun 15 Python
python调用有道智云API实现文件批量翻译
Oct 10 Python
详解Python中openpyxl模块基本用法
Feb 23 Python
用python画城市轮播地图
May 28 Python
Python中seaborn库之countplot的数据可视化使用
Jun 11 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
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
PHP定时任务延缓执行的实现
2014/10/08 PHP
php比较相似字符串的方法
2015/06/05 PHP
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
Nodejs关于gzip/deflate压缩详解
2015/03/04 NodeJs
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
Javascript Function.prototype.bind详细分析
2016/12/29 Javascript
vue定义全局变量和全局方法的方法示例
2018/08/01 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
Vue中watch、computed、updated三者的区别及用法
2020/07/27 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
Python中使用item()方法遍历字典的例子
2014/08/26 Python
Python创建xml的方法
2015/03/10 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
浅谈Python 的枚举 Enum
2017/06/12 Python
Python制作词云的方法
2018/01/03 Python
python+selenium打印当前页面的titl和url方法
2018/06/22 Python
pandas 选择某几列的方法
2018/07/03 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
Python中生成ndarray实例讲解
2021/02/22 Python
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
CSS3打造磨砂玻璃背景效果
2016/09/28 HTML / CSS
斯德哥尔摩通票:Stockholm Pass
2018/01/09 全球购物
工程质量承诺书
2014/03/27 职场文书
单位租房协议书样本
2014/10/30 职场文书
六一文艺汇演主持词
2015/06/30 职场文书
怎样写工作总结啊!
2019/06/18 职场文书
导游词之无锡梅园
2019/11/28 职场文书
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP