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学习笔记_数据排序方法
May 22 Python
Python中的对象,方法,类,实例,函数用法分析
Jan 15 Python
Python中在for循环中嵌套使用if和else语句的技巧
Jun 20 Python
python遍历 truple list dictionary的几种方法总结
Sep 11 Python
python实现list元素按关键字相加减的方法示例
Jun 09 Python
教你使用python画一朵花送女朋友
Mar 29 Python
python list元素为tuple时的排序方法
Apr 18 Python
django session完成状态保持的方法
Nov 27 Python
Python实现的微信支付方式总结【三种方式】
Apr 13 Python
Python扫描端口的实现
Jan 25 Python
Python中的socket网络模块介绍
Jul 23 Python
Python中tqdm的使用和例子
Sep 23 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 strtok()函数的优点分析
2010/03/02 PHP
PHP5 字符串处理函数大全
2010/03/23 PHP
PHP开发中常用的字符串操作函数
2011/02/08 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
JavaScript的document对象和window对象详解
2010/12/30 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
jquery解析XML字符串和XML文件的方法说明
2014/02/21 Javascript
现如今最流行的JavaScript代码规范
2014/03/08 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
2015/04/03 Javascript
JS动态增删表格行的方法
2016/03/03 Javascript
AngularJS Controller作用域
2017/01/09 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持
2017/10/21 Javascript
微信小程序使用setData修改数组中单个对象的方法分析
2018/12/30 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
Vue引入Stylus知识点总结
2020/01/16 Javascript
详解Vue串联过滤器的使用场景
2020/04/30 Javascript
Python中的多行注释文档编写风格汇总
2016/06/16 Python
Python实现计算两个时间之间相差天数的方法
2017/05/10 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
Python实现的括号匹配判断功能示例
2018/08/25 Python
python简单实现AES加密和解密
2019/03/28 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
python输出决策树图形的例子
2019/08/09 Python
Python 装饰器原理、定义与用法详解
2019/12/07 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
俄罗斯女装店:12storeez
2019/10/25 全球购物
.NET初级开发工程师面试题(包括Javascript)
2012/08/22 面试题
应聘收银员个人的求职信
2013/11/30 职场文书
医药工作岗位求职信分享
2013/12/31 职场文书
爱心捐款倡议书
2014/04/14 职场文书
文明班级申报材料
2014/12/24 职场文书