栈和队列数据结构的基本概念及其相关的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实现的数据结构与算法之快速排序详解
Apr 22 Python
在Pycharm中自动添加时间日期作者等信息的方法
Jan 16 Python
Django中自定义admin Xadmin的实现代码
Aug 09 Python
python3.7通过thrift操作hbase的示例代码
Jan 14 Python
Python任务调度模块APScheduler使用
Apr 15 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 Python
Python调用C语言程序方法解析
Jul 07 Python
详解python程序中的多任务
Sep 16 Python
Python threading模块condition原理及运行流程详解
Oct 05 Python
python之随机数函数的实现示例
Dec 30 Python
新手必备Python开发环境搭建教程
May 28 Python
仅用几行Python代码就能复制她的U盘文件?
Jun 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 adodb操作mysql数据库
2009/03/19 PHP
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
利用php绘制饼状图的实现代码
2013/06/07 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
理解Javascript_12_执行模型浅析
2010/10/18 Javascript
很好用的js日历算法详细代码
2013/03/07 Javascript
当前流行的JavaScript代码风格指南
2014/09/10 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
js动态引入的四种方法
2018/05/05 Javascript
element ui table(表格)实现点击一行展开功能
2018/12/04 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
2020/04/25 Javascript
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
Vue 解决通过this.$refs来获取DOM或者组件报错问题
2020/07/28 Javascript
Python中列表的一些基本操作知识汇总
2015/05/20 Python
Python3 处理JSON的实例详解
2017/10/29 Python
python实现linux下抓包并存库功能
2018/07/18 Python
Numpy截取指定范围内的数据方法
2018/11/14 Python
win10环境下配置vscode python开发环境的教程详解
2019/10/16 Python
使用Pandas的Series方法绘制图像教程
2019/12/04 Python
python如何实现复制目录到指定目录
2020/02/13 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
简单的项目建议书模板
2014/03/12 职场文书
篮球比赛口号
2014/06/10 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
Apache POI的基本使用详解
2021/11/07 Servers
详细介绍MySQL中limit和offset的用法
2022/05/06 MySQL
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android