栈和队列数据结构的基本概念及其相关的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实现排序算法
Feb 14 Python
python获取网页中所有图片并筛选指定分辨率的方法
Mar 31 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
Jun 13 Python
django 外键model的互相读取方法
Dec 15 Python
python lxml中etree的简单应用
May 10 Python
python装饰器练习题及答案
Nov 01 Python
python中dict()的高级用法实现
Nov 13 Python
python实现超市商品销售管理系统
Nov 22 Python
python集成开发环境配置(pycharm)
Feb 14 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
Apr 25 Python
Python 找出英文单词列表(list)中最长单词链
Dec 14 Python
matplotlib之pyplot模块实现添加子图subplot的使用
Apr 25 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
windows7下php开发环境搭建图文教程
2015/01/06 PHP
php模拟post提交数据的方法
2015/02/12 PHP
JavaScript与HTML结合的基本使用方法整理
2015/10/12 PHP
php连接oracle数据库的核心步骤
2016/05/26 PHP
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
js仿小米官网图片轮播特效
2016/09/29 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
2017/01/23 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
2017/03/17 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
vue实现滑动超出指定距离回顶部功能
2019/07/31 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
element中Steps步骤条和Tabs标签页关联的解决
2020/12/08 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
python搭建简易服务器分析与实现
2012/12/15 Python
Python中endswith()函数的基本使用
2015/04/07 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
python中hashlib模块用法示例
2017/10/30 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
Python应用库大全总结
2018/05/30 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
挪威手表购物网站:Klokker
2016/09/19 全球购物
优衣库英国官网:UNIQLO英国
2016/12/25 全球购物
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
网上卖盒饭创业计划书范文
2014/02/07 职场文书
暑期社会实践先进个人主要事迹
2014/05/22 职场文书
电子信息工程专业求职信
2014/06/28 职场文书
五一活动标语
2014/06/30 职场文书
2016思想纪律作风整顿心得体会
2016/01/23 职场文书
Python3 如何开启自带http服务
2021/05/18 Python
Python绘制地图神器folium的新人入门指南
2021/05/23 Python