栈和队列数据结构的基本概念及其相关的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中操作字典之fromkeys()方法的使用
May 21 Python
Django基础之Model操作步骤(介绍)
May 27 Python
Python3 处理JSON的实例详解
Oct 29 Python
ubuntu 16.04下python版本切换的方法
Jun 14 Python
Python 获取项目根路径的代码
Sep 27 Python
解决Pytorch训练过程中loss不下降的问题
Jan 02 Python
Python qrcode 生成一个二维码的实例详解
Feb 12 Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 Python
scrapy处理python爬虫调度详解
Nov 23 Python
Python基础之tkinter图形化界面学习
Apr 29 Python
Django实现聊天机器人
May 31 Python
Python+OpenCV实现图片中的圆形检测
Apr 07 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
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
php 广告调用类代码(支持Flash调用)
2011/08/11 PHP
php网页标题中文乱码的有效解决方法
2014/03/05 PHP
php sybase_fetch_array使用方法
2014/04/15 PHP
php操作mongoDB实例分析
2014/12/29 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
基于jquery的分页控件(C#)
2011/01/06 Javascript
再论Javascript的类继承
2011/03/05 Javascript
JQury slideToggle闪烁问题及解决办法
2011/07/05 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
多个$(document).ready()的执行顺序实例分析
2014/07/26 Javascript
js 左右悬浮对联广告代码示例
2014/12/12 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
JavaScript仿支付宝密码输入框
2015/12/29 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
nodejs简单抓包工具使用详解
2019/08/23 NodeJs
使用flow来规范javascript的变量类型
2019/09/12 Javascript
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
Python正则表达式匹配ip地址实例
2014/10/09 Python
Python常用知识点汇总
2016/05/08 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
Python如何优雅删除字符列表空字符及None元素
2020/06/25 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
美国存储和组织商店:The Container Store
2017/08/16 全球购物
年度考核评语
2014/01/19 职场文书
运动会通讯稿300字
2014/02/02 职场文书
保护环境倡议书
2014/04/14 职场文书
2014离婚协议书范文
2014/09/10 职场文书
中秋节寄语2015
2015/03/24 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js