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 16 Python
python读写二进制文件的方法
May 09 Python
Python中的字符串类型基本知识学习教程
Feb 04 Python
python基于隐马尔可夫模型实现中文拼音输入
Apr 01 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
Jun 02 Python
python实现微信发送邮件关闭电脑功能
Feb 22 Python
Sanic框架基于类的视图用法示例
Jul 18 Python
Python os.rename() 重命名目录和文件的示例
Oct 25 Python
Python操作Excel插入删除行的方法
Dec 10 Python
HTML的form表单和django的form表单
Jul 25 Python
简述python&pytorch 随机种子的实现
Oct 07 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
Jan 19 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
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
使用PHP免费发送定时短信的实例
2016/10/24 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
JS实现跟随鼠标的链接文字提示框效果
2015/08/06 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
2020/08/27 Javascript
JS操作JSON方法总结(推荐)
2016/06/14 Javascript
第二篇Bootstrap起步
2016/06/21 Javascript
js实现动态显示时间效果
2017/03/06 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
微信小程序实现弹出菜单
2018/07/19 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
Vue 中的受控与非受控组件的实现
2018/12/17 Javascript
puppeteer实现html截图的示例代码
2019/01/10 Javascript
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python中的filter()函数的用法
2015/04/27 Python
python读取和保存视频文件
2018/04/16 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
Django密码存储策略分析
2020/01/09 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
AmazeUi Tree(树形结构) 应用小结
2020/08/17 HTML / CSS
英国外籍人士的在线超市:British Corner Shop
2019/06/03 全球购物
动物科学专业毕业生的自我评价
2013/11/29 职场文书
班级德育工作实施方案
2014/02/21 职场文书
创先争优承诺书范文
2014/03/31 职场文书
公司担保书范文
2014/05/21 职场文书
公共场所标语
2014/06/30 职场文书
民族团结好少年事迹材料
2014/08/19 职场文书
社区六一儿童节活动总结
2015/02/11 职场文书
长江七号观后感
2015/06/11 职场文书