栈和队列数据结构的基本概念及其相关的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中用split()方法分割字符串的使用介绍
May 20 Python
在Python中使用zlib模块进行数据压缩的教程
Jun 26 Python
Python中偏函数用法示例
Jun 07 Python
使用Template格式化Python字符串的方法
Jan 22 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 Python
eclipse创建python项目步骤详解
May 10 Python
Python实现把多维数组展开成DataFrame
Nov 30 Python
Python3的socket使用方法详解
Feb 18 Python
Python object类中的特殊方法代码讲解
Mar 06 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
Oct 15 Python
Python如何利用正则表达式爬取网页信息及图片
Apr 17 Python
Python matplotlib安装以及实现简单曲线的绘制
Apr 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
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
js改变文章字体大小的实例代码
2013/11/27 Javascript
同域jQuery(跨)iframe操作DOM(实例讲解)
2013/12/19 Javascript
HTML页面弹出居中可拖拽的自定义窗口层
2014/05/07 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
js QQ客服悬浮效果实现代码
2014/12/12 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
2016/06/02 Javascript
js输入框使用正则表达式校验输入内容的实例
2017/02/12 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
2017/12/07 Javascript
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
通过扫小程序码实现网站登陆功能
2019/08/22 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
深入探究Python中变量的拷贝和作用域问题
2015/05/05 Python
Python实现Linux中的du命令
2017/06/12 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
2019/12/25 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
Python中的__init__作用是什么
2020/06/09 Python
浅谈keras中的keras.utils.to_categorical用法
2020/07/02 Python
基于python实现坦克大战游戏
2020/10/27 Python
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
函授本科自我鉴定
2013/11/03 职场文书
办公室员工岗位工作职责
2014/03/10 职场文书
主管竞聘书范文
2014/03/31 职场文书
社区活动策划方案
2014/08/21 职场文书
忠诚奉献演讲稿
2014/09/12 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
运动会宣传稿50字
2015/07/23 职场文书
诚信高考倡议书
2019/06/24 职场文书