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 相关文章推荐
go语言计算两个时间的时间差方法
Mar 13 Python
Python实现批量下载文件
May 17 Python
解决python2.7 查询mysql时出现中文乱码
Oct 09 Python
Python3学习urllib的使用方法示例
Nov 29 Python
Python实现的凯撒密码算法示例
Apr 12 Python
Python实现字符串的逆序 C++字符串逆序算法
May 28 Python
Python基础学习之时间转换函数用法详解
Jun 18 Python
pytorch获取vgg16-feature层输出的例子
Aug 20 Python
python logging添加filter教程
Dec 24 Python
Python如何读写字节数据
Aug 05 Python
无惧面试,带你搞懂python 装饰器
Aug 17 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 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
destoon常用的安全设置概述
2014/06/21 PHP
PHP数组操作类实例
2015/07/11 PHP
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
javascript获取ckeditor编辑器的值(实现代码)
2013/11/18 Javascript
Javascript变量作用域详解
2013/12/06 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
Vuejs实现带样式的单文件组件新方法
2017/05/02 Javascript
微信小程序 开发之全局配置
2017/05/05 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
python 列表推导式使用详解
2019/08/29 Python
Django实现将一个字典传到前端显示出来
2020/04/03 Python
用python对excel查重
2020/12/07 Python
python 实现的车牌识别项目
2021/01/25 Python
利用三角函数在canvas上画虚线的方法
2018/01/11 HTML / CSS
电子狗项圈:eDog Australia
2019/12/04 全球购物
商场客服专员岗位职责
2014/06/13 职场文书
学生会感恩节活动方案
2014/10/11 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
升学宴学生致辞
2015/09/29 职场文书
详解Redis主从复制实践
2021/05/19 Redis
nginx配置限速限流基于内置模块
2022/05/02 Servers