栈和队列数据结构的基本概念及其相关的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 14 Python
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
Python创建二维数组实例(关于list的一个小坑)
Nov 07 Python
Python实现的双色球生成功能示例
Dec 18 Python
mac系统安装Python3初体验
Jan 02 Python
对python中的logger模块全面讲解
Apr 28 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
Oct 14 Python
python获取地震信息 微信实时推送
Jun 18 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
Aug 08 Python
Python实现AI换脸功能
Apr 10 Python
Python中zipfile压缩包模块的使用
May 14 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函数的常用方法及注意之处小结
2011/07/10 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
ASP和PHP实现生成网站快捷方式并下载到桌面的方法
2014/05/08 PHP
php正则表达式学习笔记
2015/11/13 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
有趣的javascript数组定义方法
2010/09/10 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
2013/09/02 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
2015/03/03 Javascript
jquery+ajax实现注册实时验证实例详解
2015/12/08 Javascript
基于javascript实现全屏漂浮广告
2016/03/31 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
2017/12/18 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
解决layui表格内文本超出隐藏的问题
2019/09/12 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
JS指定音频audio在某个时间点进行播放
2020/11/28 Javascript
JavaScript WeakMap使用详解
2021/02/05 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
为Python的web框架编写前端模版的教程
2015/04/30 Python
python函数不定长参数使用方法解析
2019/12/14 Python
python画图常规设置方式
2020/03/05 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
2020/09/21 Python
Nike英国官网:Nike.com (UK)
2017/02/13 全球购物
纽约香氛品牌:NEST Fragrance
2018/10/15 全球购物
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
吴仁宝观后感
2015/06/09 职场文书
2016年小学生寒假家长评语
2015/10/10 职场文书
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python
详解Vue的列表渲染
2021/11/20 Vue.js
Hive日期格式转换方法总结
2022/06/25 数据库