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解析网页源代码中的115网盘链接实例
Sep 30 Python
python select.select模块通信全过程解析
Sep 20 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
python3.6的venv模块使用详解
Aug 01 Python
python实现简单http服务器功能
Sep 17 Python
python实现抖音点赞功能
Apr 07 Python
python爬虫 urllib模块反爬虫机制UA详解
Aug 20 Python
python使用socket实现的传输demo示例【基于TCP协议】
Sep 24 Python
什么是python的必选参数
Jun 21 Python
python ssh 执行shell命令的示例
Sep 29 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
Feb 20 Python
Python中Selenium对Cookie的操作方法
Jul 09 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 SQL之where语句生成器
2009/03/24 PHP
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
用php的ob_start来生成静态页面的方法分析
2011/03/09 PHP
php中count获取多维数组长度的方法
2014/11/03 PHP
php+mysql数据库查询实例
2015/01/21 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
2017/06/06 PHP
JavaScript的变量作用域深入理解
2009/10/25 Javascript
js点击事件链接的问题解决
2014/04/25 Javascript
javascript中hasOwnProperty() 方法使用指南
2015/03/09 Javascript
javascript实现全局匹配并替换的方法
2015/04/27 Javascript
AngularJS基础 ng-repeat 指令简单示例
2016/08/03 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
JS命令模式例子之菜单程序
2016/10/10 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
基于jQuery实现瀑布流页面
2017/04/11 jQuery
微信小程序-getUserInfo回调的实例详解
2017/10/27 Javascript
python的id()函数介绍
2013/02/10 Python
跟老齐学Python之正规地说一句话
2014/09/28 Python
详解Python中的元组与逻辑运算符
2015/10/13 Python
Python入门教程之运算符与控制流
2016/08/17 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
python中列表和元组的区别
2017/12/18 Python
Python实现抓取HTML网页并以PDF文件形式保存的方法
2018/05/08 Python
python MNIST手写识别数据调用API的方法
2018/08/08 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
2019/03/13 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
Python requests设置代理的方法步骤
2020/02/23 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
Html5页面上如何禁止手机虚拟键盘弹出
2020/03/19 HTML / CSS
校企合作协议书
2014/04/16 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
python3实现Dijkstra算法最短路径的实现
2021/05/12 Python
Python利用zhdate模块实现农历日期处理
2022/03/31 Python