栈和队列数据结构的基本概念及其相关的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实现Tab自动补全和历史命令管理的方法
Mar 12 Python
Python多线程编程(五):死锁的形成
Apr 05 Python
python获取当前时间对应unix时间戳的方法
May 15 Python
Python全局变量用法实例分析
Jul 19 Python
Python连接SQLServer2000的方法详解
Apr 19 Python
python实现发送邮件功能代码
Dec 14 Python
python实现文件的备份流程详解
Jun 18 Python
详解python中的模块及包导入
Aug 30 Python
Centos7 下安装最新的python3.8
Oct 28 Python
Python使用pyyaml模块处理yaml数据
Apr 14 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 Python
关于Theano和Tensorflow多GPU使用问题
Jun 19 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
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
山进SANGEAN ATS-909X电路分析
2021/03/02 无线电
转PHP手册及PHP编程标准
2006/12/17 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
php动态函数调用方法
2015/05/21 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
2019/03/30 PHP
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
JavaScript 学习笔记(十一)
2010/01/19 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
使用jquery.qrcode生成彩色二维码实例
2014/08/08 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
.NET微信公众号开发之创建自定义菜单
2015/07/16 Javascript
jquery+ajax请求且带返回值的代码
2015/08/12 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
2016/05/05 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
express中static中间件的具体使用方法
2019/10/17 Javascript
[05:20]2018DOTA2亚洲邀请赛主赛事第三日战况回顾 LGD率先挺进胜者组决赛
2018/04/06 DOTA
Python统计日志中每个IP出现次数的方法
2015/07/06 Python
详解Python之数据序列化(json、pickle、shelve)
2017/03/30 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
使用WingPro 7 设置Python路径的方法
2019/07/24 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
解决pip安装的第三方包在PyCharm无法导入的问题
2020/10/15 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
HTML5+Canvas+CSS3实现齐天大圣孙悟空腾云驾雾效果
2016/04/26 HTML / CSS
普通大学毕业生自荐信
2013/11/04 职场文书
国贸专业个人求职信分享
2013/12/04 职场文书
司法助理专业自荐书
2014/06/13 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书