栈和队列数据结构的基本概念及其相关的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使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
Python实现的最近最少使用算法
Jul 10 Python
TensorFlow安装及jupyter notebook配置方法
Sep 08 Python
python: 自动安装缺失库文件的方法
Oct 22 Python
pycharm创建scrapy项目教程及遇到的坑解析
Aug 15 Python
django框架单表操作之增删改实例分析
Dec 16 Python
TensorFlow基本的常量、变量和运算操作详解
Feb 03 Python
Python2和Python3中@abstractmethod使用方法
Feb 04 Python
利用python汇总统计多张Excel
Sep 22 Python
OpenCV利用python来实现图像的直方图均衡化
Oct 21 Python
python如何进行基准测试
Apr 26 Python
Python+Tkinter制作专属图形化界面
Apr 01 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
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
PHP getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
Nigma vs Liquid BO3 第二场2.13
2021/03/10 DOTA
jQuery 学习第七课 扩展jQuery的功能 插件开发
2010/05/17 Javascript
JavaScript初学者应注意的七个细节小结
2012/01/30 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
2015/11/24 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
2018/05/22 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
2018/09/27 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
vue+iview动态渲染表格详解
2019/03/19 Javascript
微信小程序城市选择及搜索功能的方法
2019/03/22 Javascript
jstree中的checkbox默认选中和隐藏示例代码
2019/12/29 Javascript
[00:03]DOTA2新版本PA至宝展示
2014/11/19 DOTA
CentOS6.5设置Django开发环境
2016/10/13 Python
pip install python 快速安装模块的教程图解
2019/10/08 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
2019/10/12 Python
Python批量删除mysql中千万级大量数据的脚本分享
2020/12/03 Python
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
Stylenanda中文站:韩国一线网络服装品牌
2016/12/22 全球购物
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
成语的广告词
2014/03/19 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
分公司经理任命书
2014/06/05 职场文书
单位介绍信格式
2015/01/31 职场文书
美元符号 $
2022/02/17 杂记