栈和队列数据结构的基本概念及其相关的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的Django框架中的ORM建立查询API
Apr 20 Python
python 简单备份文件脚本v1.0的实例
Nov 06 Python
Python实现基本数据结构中栈的操作示例
Dec 04 Python
Python实现pdf文档转txt的方法示例
Jan 19 Python
5个很好的Python面试题问题答案及分析
Jan 19 Python
PyCharm代码整体缩进,反向缩进的方法
Jun 25 Python
Python实现字典按key或者value进行排序操作示例【sorted】
May 03 Python
Python更新所有已安装包的操作
Feb 13 Python
python实现简单的购物程序代码实例
Mar 03 Python
如何表示python中的相对路径
Jul 08 Python
opencv用VS2013调试时用Image Watch插件查看图片
Jul 26 Python
Python开发简易五子棋小游戏
May 02 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载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
2016/11/14 PHP
PHP支付宝当面付2.0代码
2018/12/21 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
2019/03/18 PHP
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
图片onload事件触发问题解决方法
2011/07/31 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
2012/12/09 Javascript
from 表单提交返回值用post或者是get方法实现
2013/08/21 Javascript
Jquery 例外被抛出且未被接住原因介绍
2013/09/04 Javascript
JavaScript数组的一些奇葩行为
2016/01/25 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
nodejs 终端打印进度条实例代码
2017/04/22 NodeJs
微信小程序登录态和检验注册过没的app.js写法
2019/05/22 Javascript
微信小程序 textarea 层级过高问题简单解决方案
2019/10/14 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
Python的collections模块中namedtuple结构使用示例
2016/07/07 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
在VS Code上搭建Python开发环境的方法
2018/04/06 Python
用Python分析3天破10亿的《我不是药神》到底神在哪?
2018/07/12 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
pandas参数设置的实用小技巧
2020/08/23 Python
英国领先的酒杯和水晶玻璃器皿制造商:Dartington Crystal
2019/06/23 全球购物
二手书店创业计划书
2014/01/16 职场文书
商场中秋节活动方案
2014/02/07 职场文书
社区清明节活动总结
2014/07/04 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
司法局群众路线教育实践活动整改措施
2014/09/17 职场文书
责任书格式
2015/01/29 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
电信营业员岗位职责
2015/04/14 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
python执行js代码的方法
2021/05/13 Python
Java SSM配置文件案例详解
2021/08/30 Java/Android
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏