栈和队列数据结构的基本概念及其相关的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多进程操作实例
Nov 21 Python
python实现按行切分文本文件的方法
Apr 18 Python
Python3连接MySQL(pymysql)模拟转账实现代码
May 24 Python
独特的python循环语句
Nov 20 Python
Python 实现引用其他.py文件中的类和类的方法
Apr 29 Python
在python tkinter中Canvas实现进度条显示的方法
Jun 14 Python
Python对接六大主流数据库(只需三步)
Jul 31 Python
Django缓存系统实现过程解析
Aug 02 Python
Python 点击指定位置验证码破解的实现代码
Sep 11 Python
pycharm实现在虚拟环境中引入别人的项目
Mar 09 Python
python常量折叠基础知识点讲解
Feb 28 Python
python之django路由和视图案例教程
Jul 26 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实现mysql事务处理的方法
2014/12/25 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
PHP实现统计在线人数功能示例
2016/10/15 PHP
php根据年月获取当月天数及日期数组的方法
2016/11/30 PHP
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
EasyUI中combobox默认值注意事项
2015/03/01 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
jQuery Easyui 下拉树组件combotree
2016/12/16 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
bootstrap配合Masonry插件实现瀑布式布局
2017/01/18 Javascript
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
python爬虫入门教程之点点美女图片爬虫代码分享
2014/09/02 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
2018/11/29 Python
pytorch实现用CNN和LSTM对文本进行分类方式
2020/01/08 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
如何利用python正则表达式匹配版本信息
2020/12/09 Python
H5 canvas中width、height和style的宽高区别详解
2018/11/02 HTML / CSS
美国百年历史早餐食品供应商:Wolferman’s
2017/01/18 全球购物
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
介绍一下SQL Server里面的索引视图
2016/07/31 面试题
护士毕业实习感言
2014/03/05 职场文书
锦旗标语大全
2014/06/23 职场文书
批评与自我批评范文
2014/10/15 职场文书
学校群众路线专项整治方案
2014/10/31 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
小马王观后感
2015/06/11 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书