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 实现插入排序算法
Jun 05 Python
Python制作爬虫抓取美女图
Jan 20 Python
图文讲解选择排序算法的原理及在Python中的实现
May 04 Python
python学习教程之使用py2exe打包
Sep 24 Python
Python操作mysql数据库实现增删查改功能的方法
Jan 15 Python
python解析json串与正则匹配对比方法
Dec 20 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
python+selenium select下拉选择框定位处理方法
Aug 24 Python
python两个_多个字典合并相加的实例代码
Dec 26 Python
Python如何访问字符串中的值
Feb 09 Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 Python
django models里数据表插入数据id自增操作
Jul 15 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生成局部唯一识别码LUID的代码
2012/10/06 PHP
有道搜索和IP138的IP的API接口(PHP应用)
2012/11/29 PHP
领悟php接口中interface存在的意义
2013/06/27 PHP
php ios推送(代码)
2013/07/01 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
PHP实现的支付宝支付功能示例
2019/03/26 PHP
List Installed Software Features
2007/06/11 Javascript
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
2016/10/12 Javascript
详解springmvc 接收json对象的两种方式
2016/12/06 Javascript
使用ionic在首页新闻中应用到的跑马灯效果的实现方法
2017/02/13 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
2017/07/31 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
Angular6 Filter实现页面搜索的示例代码
2018/12/02 Javascript
微信小程序分享海报生成的实现方法
2018/12/10 Javascript
微信小程序移动拖拽视图-movable-view实例详解
2019/08/17 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
vue点击自增和求和的实例代码
2019/11/06 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
vue实现瀑布流组件滑动加载更多
2020/03/10 Javascript
[31:00]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS iG
2014/05/25 DOTA
用Python的SimPy库简化复杂的编程模型的介绍
2015/04/13 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
python 3.6.2 安装配置方法图文教程
2018/09/18 Python
opencv3/C++ 平面对象识别&透视变换方式
2019/12/11 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
2021/02/22 Python
浅谈three.js中的needsUpdate的应用
2012/11/12 HTML / CSS
党员个人查摆剖析材料
2014/10/16 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书