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生成指定长度的随机数密码
Jan 23 Python
Python基于pygame实现图片代替鼠标移动效果
Nov 11 Python
python 每天如何定时启动爬虫任务(实现方法分享)
May 21 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
Jul 17 Python
解决python "No module named pip" 的问题
Oct 13 Python
PyQt5固定窗口大小的方法
Jun 18 Python
关于初始种子自动选取的区域生长实例(python+opencv)
Jan 16 Python
树莓派4B安装Tensorflow的方法步骤
Jul 16 Python
快速解决pymongo操作mongodb的时区问题
Dec 05 Python
termux中matplotlib无法显示中文问题的解决方法
Jan 11 Python
Python面向对象编程之类的概念
Nov 01 Python
python多次执行绘制条形图
Apr 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 如何向 MySQL 发送数据
2006/10/09 PHP
php 信息采集程序代码
2009/03/17 PHP
PHP 可阅读随机字符串代码
2010/05/26 PHP
PHP操作xml代码
2010/06/17 PHP
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
常用PHP封装分页工具类
2017/01/14 PHP
Thinkphp极验滑动验证码实现步骤解析
2020/11/24 PHP
详解如何构建Angular项目目录结构
2017/07/13 Javascript
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
简述JS控制台的使用
2018/07/15 Javascript
JavaScript数组方法的错误使用例子
2018/09/13 Javascript
微信小程序websocket聊天室的实现示例代码
2019/02/12 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
Sanic框架Cookies操作示例
2018/07/17 Python
pytorch 数据集图片显示方法
2018/07/26 Python
Python Opencv实现图像轮廓识别功能
2020/03/23 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
利用pandas向一个csv文件追加写入数据的实现示例
2020/04/23 Python
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
Python 合并拼接字符串的方法
2020/07/28 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
html5 标签
2009/07/16 HTML / CSS
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
小学教育毕业生自荐信
2013/11/18 职场文书
产品销售员岗位职责
2013/12/18 职场文书
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
开会迟到检讨书
2014/02/03 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
仲裁协议书
2014/09/26 职场文书
现实表现材料范文
2014/12/23 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL
详解分布式系统中如何用python实现Paxos
2021/05/18 Python