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中运行并行任务技巧
Feb 26 Python
Python单元测试框架unittest使用方法讲解
Apr 13 Python
python解决pandas处理缺失值为空字符串的问题
Apr 08 Python
python 阶乘累加和的实例
Feb 01 Python
基于OpenCV python3实现证件照换背景的方法
Mar 22 Python
连接pandas以及数组转pandas的方法
Jun 28 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
Mar 05 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
音频处理 windows10下python三方库librosa安装教程
Jun 20 Python
ubuntu安装jupyter并设置远程访问的实现
Mar 31 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采集速度探究总结(原创)
2008/04/18 PHP
php实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
php实现的简单日志写入函数
2015/03/31 PHP
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
jquery模拟LCD 时钟的html文件源代码
2014/06/16 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
js+css实现有立体感的按钮式文字竖排菜单效果
2015/09/01 Javascript
详解AngularJS控制器的使用
2016/03/09 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
新手必须知的Node.js 4个JavaScript基本概念
2018/09/16 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
[43:26]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第二场 11.20
2020/11/23 DOTA
使用SAE部署Python运行环境的教程
2015/05/05 Python
python操作ie登陆土豆网的方法
2015/05/09 Python
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
如何在django里上传csv文件并进行入库处理的方法
2019/01/02 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
2020/05/27 Python
Python grpc超时机制代码示例
2020/09/14 Python
创建学习型党组织实施方案
2014/03/29 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
2014年中职班主任工作总结
2014/12/16 职场文书
先进个人推荐材料
2014/12/29 职场文书
活动经费申请报告
2015/05/15 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python