栈和队列数据结构的基本概念及其相关的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中多线程及程序锁浅析
Jan 21 Python
Python用sndhdr模块识别音频格式详解
Jan 11 Python
python通过zabbix api获取主机
Sep 17 Python
Python实现查找最小的k个数示例【两种解法】
Jan 08 Python
Python循环中else,break和continue的用法实例详解
Jul 11 Python
Flask教程之重定向与错误处理实例分析
Aug 01 Python
python编写简单端口扫描器
Sep 04 Python
python中自带的三个装饰器的实现
Nov 08 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
Python 实现简单的客户端认证
Jul 29 Python
python字符串拼接+和join的区别详解
Dec 03 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 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
php的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
PHP提交表单失败后如何保留已经填写的信息
2014/06/20 PHP
php eval函数一句话木马代码
2015/05/21 PHP
PHP实现伪静态方法汇总
2016/01/13 PHP
php实现算术验证码功能
2018/12/05 PHP
Javascript的IE和Firefox兼容性汇编
2006/07/01 Javascript
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
jquery radio 操作代码
2011/03/16 Javascript
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
2011/07/31 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
JS实现QQ图片一闪一闪的效果小例子
2013/07/31 Javascript
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
用jquery实现的一个超级简单的下拉菜单
2014/05/18 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
jQuery实现带动画效果的二级下拉导航方法
2015/03/11 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
JS作为值的函数用法示例
2016/06/20 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
2018/01/11 Javascript
JavaScript实现计算多边形质心的方法示例
2018/01/31 Javascript
vue单页面在微信下只能分享落地页的解决方案
2019/04/15 Javascript
Element-ui el-tree新增和删除节点后如何刷新tree的实例
2020/08/31 Javascript
python使用Image处理图片常用技巧分析
2015/06/01 Python
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
在django view中给form传入参数的例子
2019/07/19 Python
详解django实现自定义manage命令的扩展
2019/08/13 Python
学python爬虫能做什么
2020/07/29 Python
Python 保存加载mat格式文件的示例代码
2020/08/04 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
医科大学生的自我评价
2013/12/04 职场文书
文艺晚会主持词
2014/03/24 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
少先队辅导员事迹材料
2014/12/24 职场文书