栈和队列数据结构的基本概念及其相关的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的id()函数介绍
Feb 10 Python
使用paramiko远程执行命令、下发文件的实例
Oct 01 Python
python3实现钉钉消息推送的方法示例
Mar 14 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
Apr 10 Python
python使用pandas处理大数据节省内存技巧(推荐)
May 05 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
Jul 06 Python
决策树剪枝算法的python实现方法详解
Sep 18 Python
解决pycharm中的run和debug失效无法点击运行
Jun 09 Python
Keras 切换后端方式(Theano和TensorFlow)
Jun 19 Python
Python读取Excel一列并计算所有对象出现次数的方法
Sep 04 Python
python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解
Dec 22 Python
Python快速实现一键抠图功能的全过程
Jun 29 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
PHP无敌近乎加密方式!
2010/07/17 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
php使用百度天气接口示例
2014/04/22 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
javascript 变量作用域 代码分析
2009/06/26 Javascript
jquery 漂亮的删除确认和提交无刷新删除示例
2013/11/13 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
2014/03/12 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
jsPDF导出pdf示例
2014/05/02 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
AngularJS控制器详解及示例代码
2016/08/16 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
用React-Native+Mobx做一个迷你水果商城APP(附源码)
2017/12/25 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
Vue结合后台导入导出Excel问题详解
2019/02/19 Javascript
基于vue--key值的特殊用处详解
2020/07/31 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
Python解释执行原理分析
2014/08/22 Python
Python编程之黑板上排列组合,你舍得解开吗
2017/10/30 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
python3写的简单本地文件上传服务器实例
2018/06/04 Python
Python面向对象之类的定义与继承用法示例
2019/01/14 Python
Python笔记之观察者模式
2019/11/20 Python
简单的命令查看安装的python版本号
2020/08/28 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
花卉与景观设计系大学生求职信
2013/10/01 职场文书
音乐学个人的自荐书范文
2013/11/26 职场文书
寄语是什么意思
2014/04/10 职场文书
优秀少先队大队辅导员事迹材料
2014/05/04 职场文书
公司担保书范文
2014/05/21 职场文书
小学清明节活动总结
2014/07/04 职场文书
后备干部推荐材料
2014/12/24 职场文书
单位政审意见范文
2015/06/04 职场文书
创业计划书之酒厂
2019/10/14 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python