栈和队列数据结构的基本概念及其相关的Python实现


Posted in Python onAugust 24, 2015

先来回顾一下栈和队列的基本概念:

相同点:从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同。

不同点:栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。 队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。它们是完全不同的数据类型。除了它们各自的基本操作集不同外,主要区别是对插入和删除操作的"限定"。

栈必须按"后进先出"的规则进行操作:比如说,小学老师批改学生的作业,如果不打乱作业本的顺序的话,那么老师批改的第一份作业一定是最后那名同学交的那份作业,如果把所有作业本看作是一个栈中的元素,那么最后一个同学交的作业本就是栈顶元素,而第一个同学交的,也就是最低端的作业本,就是栈底元素,这就是对栈的读取规则。

而队列必须按"先进先出"的规则进行操作:打个比方,一些人去银行办理业务,一定是先去排队的最先得到服务,当然他也是第一个走出银行的(假设这些人都在一个窗口排队)。如果把所有这些等候服务的人看作是队的元素,第一个人就是对头元素,相应的,最后一个人就是队尾元素。这是队的读取规则。

用Python实现栈,这是Python核心编程里的一个例子:

#!/usr/bin/env python 
 
#定义一个列表来模拟栈 
stack = [] 
 
#进栈,调用列表的append()函数加到列表的末尾,strip()没有参数是去掉首尾的空格 
def pushit(): 
  stack.append(raw_input('Enter new string: ').strip()) 
 
#出栈,用到了pop()函数 
def popit(): 
  if len(stack) == 0: 
    print 'Cannot pop from an empty stack!' 
  else: 
    print 'Removed [', stack.pop(), ']' 
 
#编历栈 
def viewstack(): 
  print stack 
 
#CMDs是字典的使用 
CMDs = {'u': pushit, 'o': popit, 'v': viewstack} 
 
#pr为提示字符 
def showmenu(): 
  pr = """ 
  p(U)sh 
  p(O)p 
  (V)iew 
  (Q)uit 
    Enter choice: """ 
 
  while True: 
    while True: 
      try: 
        #先用strip()去掉空格,再把第一个字符转换成小写的 
        choice = raw_input(pr).strip()[0].lower() 
      except (EOFError, KeyboardInterrupt, IndexError): 
        choice = 'q' 
 
      print '\nYou picked: [%s]' % choice 
      if choice not in 'uovq': 
        print 'Invalid option, try again' 
      else: 
        break 
 
#CMDs[]根据输入的choice从字典中对应相应的value,比如说输入u,从字典中得到value为pushit,执行pushit()进栈操作 
    if choice == 'q': 
      break 
    CMDs[choice]() 
 
#判断是否是从本文件进入,而不是被调用 
if __name__ == '__main__': 
  showmenu()

用Python实现队列:

#!/usr/bin/env python 
 
queue = [] 
 
def enQ(): 
  queue.append(raw_input('Enter new string: ').strip()) 
 
#调用list的列表的pop()函数.pop(0)为列表的第一个元素 
def deQ(): 
  if len(queue) == 0: 
    print 'Cannot pop from an empty queue!' 
  else: 
    print 'Removed [', queue.pop(0) ,']' 
 
def viewQ(): 
  print queue 
 
CMDs = {'e': enQ, 'd': deQ, 'v': viewQ} 
 
def showmenu(): 
  pr = """ 
  (E)nqueue 
  (D)equeue 
  (V)iew 
  (Q)uit 
    Enter choice: """ 
 
  while True: 
    while True: 
      try: 
        choice = raw_input(pr).strip()[0].lower() 
      except (EOFError, KeyboardInterrupt, IndexError): 
        choice = 'q' 
 
      print '\nYou picked: [%s]' % choice 
      if choice not in 'devq': 
        print 'Invalid option, try again' 
      else: 
        break 
    if choice == 'q': 
      break 
    CMDs[choice]() 
 
if __name__ == '__main__': 
  showmenu()
Python 相关文章推荐
详解Python当中的字符串和编码
Apr 25 Python
Python装饰器使用实例:验证参数合法性
Jun 24 Python
分析Python中设计模式之Decorator装饰器模式的要点
Mar 02 Python
python读取Excel实例详解
Aug 17 Python
对pandas中两种数据类型Series和DataFrame的区别详解
Nov 12 Python
ZABBIX3.2使用python脚本实现监控报表的方法
Jul 02 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
Django中URL的参数传递的实现
Aug 04 Python
Python 面向对象之类class和对象基本用法示例
Feb 02 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
django admin 添加自定义链接方式
Mar 11 Python
python实现图片,视频人脸识别(dlib版)
Nov 18 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
Aug 23 #Python
Python中for循环和while循环的基本使用方法
Aug 21 #Python
Python中条件判断语句的简单使用方法
Aug 21 #Python
Python编程中的异常处理教程
Aug 21 #Python
剖析Python的Tornado框架中session支持的实现代码
Aug 21 #Python
约瑟夫问题的Python和C++求解方法
Aug 20 #Python
在类Unix系统上开始Python3编程入门
Aug 20 #Python
You might like
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
php排序算法(冒泡排序,快速排序)
2012/10/09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
2014/06/26 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
PHP 数组current和next用法分享
2015/03/05 Javascript
解析Node.js基于模块和包的代码部署方式
2016/02/16 Javascript
懒加载实现的分页&&网站footer自适应
2016/12/21 Javascript
js+html5生成自动排列对话框实例
2017/10/09 Javascript
浅析node.js的模块加载机制
2018/05/25 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
通过Nodejs搭建网站简单实现注册登录流程
2019/06/14 NodeJs
Node.JS枚举统计当前文件夹和子目录下所有代码文件行数
2019/08/23 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
[46:20]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python算法学习之基数排序实例
2013/12/18 Python
python定时器(Timer)用法简单实例
2015/06/04 Python
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
详解django实现自定义manage命令的扩展
2019/08/13 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
Pyspark获取并处理RDD数据代码实例
2020/03/27 Python
Python类成员继承重写的实现
2020/09/16 Python
Django如何继承AbstractUser扩展字段
2020/11/27 Python
英国殿堂级有机护肤品牌:Rodial
2017/04/17 全球购物
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
应用心理学个人求职信范文
2013/12/11 职场文书
大学生入党思想汇报
2014/01/14 职场文书
大二学生职业生涯规划书
2014/02/05 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
公司保洁员岗位职责
2015/02/13 职场文书
开学随笔
2015/08/15 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL
Python使用mitmproxy工具监控手机 下载手机小视频
2022/04/18 Python