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脚本实现查找webshell的方法
Jul 31 Python
python 开发的三种运行模式详细介绍
Jan 18 Python
Python实现Mysql数据库连接池实例详解
Apr 11 Python
使用python将大量数据导出到Excel中的小技巧分享
Jun 14 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
Oct 15 Python
python3中property使用方法详解
Apr 23 Python
linux环境下Django的安装配置详解
Jul 22 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 Python
解决tensorflow读取本地MNITS_data失败的原因
Jun 22 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
Aug 07 Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 Python
python如何写个俄罗斯方块
Nov 06 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 eval函数使用介绍
2013/12/08 PHP
2014年10个最佳的PHP图像操作库
2014/07/14 PHP
PHP在线书签系统分享
2016/01/04 PHP
php字符集转换
2017/01/23 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
2019/05/13 PHP
IE bug table元素的innerHTML
2010/01/11 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
2011/10/29 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
JavaScript中的bold()方法使用详解
2015/06/08 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
非常漂亮的相册集 使用jquery制作相册集
2016/04/28 Javascript
AngularJS教程之MVC体系结构详解
2016/08/16 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
简单实现jQuery轮播效果
2017/08/18 jQuery
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
python中不能连接超时的问题及解决方法
2018/06/10 Python
使用Python操作FTP实现上传和下载的方法
2019/04/01 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
不同浏览器创建XMLHttpRequest方法有什么不同
2014/11/17 面试题
集中采购方案
2014/06/10 职场文书
优质服务口号
2014/06/11 职场文书
党的生日演讲稿
2014/09/10 职场文书
教育实践活动对照检查材料
2014/09/23 职场文书
纪检干部个人对照检查材料
2014/09/23 职场文书
学习雷锋精神倡议书
2015/04/27 职场文书
酒店员工手册范本
2015/05/14 职场文书
小学数学教师研修感悟
2015/11/18 职场文书
资深HR教你写好简历中的自我评价
2019/05/07 职场文书
goland 设置project gopath的操作
2021/05/06 Golang
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS