栈和队列数据结构的基本概念及其相关的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 相关文章推荐
netbeans7安装python插件的方法图解
Dec 24 Python
python实现计算资源图标crc值的方法
Oct 05 Python
Python入门篇之列表和元组
Oct 17 Python
Python浅拷贝与深拷贝用法实例
May 09 Python
详解python中的json的基本使用方法
Dec 21 Python
200行自定义python异步非阻塞Web框架
Mar 15 Python
Python实现去除列表中重复元素的方法小结【4种方法】
Apr 27 Python
python3的print()函数的用法图文讲解
Jul 16 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
Jul 19 Python
python实现的多任务版udp聊天器功能案例
Nov 13 Python
Python while循环使用else语句代码实例
Feb 07 Python
Python利用matplotlib绘制折线图的新手教程
Nov 05 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实现根据url自动生成缩略图的方法
2014/09/23 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
利用php生成验证码
2017/02/23 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
JavaScript 验证浏览器是否支持javascript的方法小结
2009/05/17 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
jquery转盘抽奖功能实现
2015/11/13 Javascript
深入浅析AngularJS中的module(模块)
2016/01/04 Javascript
javaScript中的原型解析【推荐】
2016/05/05 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
d3.js中冷门却实用的内置函数总结
2017/02/04 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
Python入门学习之字符串与比较运算符
2015/10/12 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
在python环境下运用kafka对数据进行实时传输的方法
2018/12/27 Python
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
TobyDeals美国:在电子产品上获得最好的优惠和折扣
2019/08/11 全球购物
海量信息软件测试笔试题
2015/08/08 面试题
职业生涯规划怎么写
2013/12/29 职场文书
节约用电标语
2014/06/17 职场文书
IT工程师岗位职责
2014/07/04 职场文书
项目验收申请报告
2015/05/15 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书
《当代神农氏》教学反思
2016/02/23 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
Python中OpenCV实现简单车牌字符切割
2021/06/11 Python
python垃圾回收机制原理分析
2022/04/13 Python
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android