Python数据结构之栈、队列的实现代码分享


Posted in Python onDecember 04, 2017

1. 栈

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

栈(Stack)是限制插入和删除操作只能在一个位置进行的表,该位置是表的末端,称为栈的顶(top)。栈的基本操作有PUSH(入栈)和POP(出栈)。栈又被称为LIFO(后入先出)表。

1.1 栈的实现

class Stack(object):
  def __init__(self):
    self.stack=[]
  def isEmpty(self):
    return self.stack==[]
  def push(self,item):
    self.stack.append(item)
  def pop(self):
    if self.isEmpty():
      raise IndexError,'pop from empty stack'
    return self.stack.pop()
  def peek(self):
    return self.stack[-1]
  def size(self):
    return len(self.stack)

1.2 栈应用

1.2.1 检查程序中成对的符号

程序的语法错误经常是由缺少一个符号造成的。可用栈来检查符号是否成对。做一个空栈,如果字符是开放符号('({[')则将其push栈中。如果符号是个闭合符号(')]}'),则当栈空时报错,对应'()}'的错误。否则,将栈pop,如果弹出的符号不是对应的开放符号,则报错,对应'(}'的错误。文件末尾,如果栈为空,则报错,对应'({}'的错误。

def match(i,j):
  opens='([{'
  closes=')]}'
  return opens.index(i)==closes.index(j)
def syntaxChecker(string):
  stack=Stack()
  balanced=True
  for i in string:
    if i in '([{':
      stack.push(i)
    elif i in ')]}':
      if stack.isEmpty():
        balanced=False
        break
      else:
        j=stack.pop()
        if not match(j,i):
          balanced=False
          break
  if not stack.isEmpty():
    balanced=False
  return balanced

1.2.2 进制转换

十进制转换二进制:把十进制转成二进制一直分解至商数为0。从最底左边数字开始读,之后读右边的数字,从下读到上。

来自《Problem Solving with Algorithms and Data Structures》的图片:

Python数据结构之栈、队列的实现代码分享

代码:

def decimal_to_bin(dec):
  stack=Stack()
  cur=dec
  while cur>0:
    a=cur%2
    cur=cur/2
    stack.push(a)
  binstr=''
  while not stack.isEmpty():
    binstr+=str(stack.pop())
  return binstr

1.2.3 后缀记法

后缀记法(postfix),使用一个栈,见到一个数时入栈,遇到一个运算符时就作用于从栈弹出的两个元素,将结果弹入栈中。

(7+8)/(3+2)可以写作7 8 + 3 2 + /

来自《Problem Solving with Algorithms and Data Structures》的图片:

Python数据结构之栈、队列的实现代码分享

def infixtoPostfix(infix):
  a={}
  a['*']=3
  a['/']=3
  a['+']=2
  a['-']=2
  a['(']=1
  stack=Stack()
  post=''
  for i in infix:
    if i not in a and i!=')':
      post+=i
    elif i=='(':
      stack.push(i)
    elif i==')':
      top=stack.pop()
      while top!='(':
        post+=top
        top=stack.pop()
    else:     
      while not stack.isEmpty() and a[i]<=a[stack.peek()]:
        post+=stack.pop()
      stack.push(i)
  while not stack.isEmpty():
    post+=stack.pop()
  return post
          
def postfixExp(postfix):
  stack=Stack()
  postlist=postfix.split()
  for i in postlist:
    if i not in '+-*/':
      stack.push(i)
    else:
      a=stack.pop()
      b=stack.pop()
      result=math(i,b,a)
      stack.push(result)
  return stack.pop()
def math(x,y,z):
  if x=='+':
    return float(y)+float(z)
  if x=='-':
    return float(y)-float(z)
  if x=='*':
    return float(y)*float(z)
  if x=='/':
    return float(y)/float(z)

2 队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列(queue)也是表,使用队列时插入和删除在不同的端进行。队列的基本操作是Enqueue(入队),在表的末端(rear)插入一个元素,还有出列(Dequeue),删除表开头的元素。

class Queue(object):
  def __init__(self):
    self.queue=[]
  def isEmpty(self):
    return self.queue==[]
  def enqueue(self,x):
    self.queue.append(x)
  def dequeue(self):
    if self.queue:
      a=self.queue[0]
      self.queue.remove(a)
      return a
    else:
      raise IndexError,'queue is empty'
  def size(self):
    return len(self.queue)

总结

以上就是本文关于Python数据结构之栈、队列的实现代码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python实现ftp客户端示例分享
Feb 17 Python
详解常用查找数据结构及算法(Python实现)
Dec 09 Python
python 获取当天每个准点时间戳的实例
May 22 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
Dec 15 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
Jun 04 Python
python原类、类的创建过程与方法详解
Jul 19 Python
python的help函数如何使用
Jun 11 Python
python中id函数运行方式
Jul 03 Python
Python如何读写字节数据
Aug 05 Python
python 利用opencv实现图像网络传输
Nov 12 Python
python中使用.py配置文件的方法详解
Nov 23 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
Mar 03 Python
关于Python数据结构中字典的心得
Dec 04 #Python
python Flask实现restful api service
Dec 04 #Python
浅谈Python中带_的变量或函数命名
Dec 04 #Python
Python中对象的引用与复制代码示例
Dec 04 #Python
Python3 Random模块代码详解
Dec 04 #Python
利用python爬取斗鱼app中照片方法实例
Dec 03 #Python
CentOS 6.5中安装Python 3.6.2的方法步骤
Dec 03 #Python
You might like
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
php+mysql实现无限分类实例详解
2015/01/15 PHP
php模式设计之观察者模式应用实例分析
2019/09/25 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
纯CSS3实现质感细腻丝滑按钮
2021/03/09 HTML / CSS
ExtJs事件机制基本代码模型和流程解析
2010/10/24 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
jQuery.Callbacks()回调函数队列用法详解
2016/06/14 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
jQuery表单验证简单示例
2016/10/17 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
vue+iview+less+echarts实战项目总结
2018/02/22 Javascript
浅析Vue 和微信小程序的区别、比较
2018/08/03 Javascript
Vue全局分页组件的实现代码
2018/08/10 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
了解JavaScript中的选择器
2019/05/24 Javascript
基于vue和websocket的多人在线聊天室
2020/02/01 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
详谈Object.defineProperty 及实现数据双向绑定
2020/07/18 Javascript
在Python的web框架中配置app的教程
2015/04/30 Python
Python实现统计文本文件字数的方法
2017/05/05 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
一文带你了解Python 四种常见基础爬虫方法介绍
2020/12/04 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
CSS3对图片照片进行边缘模糊处理的实现
2018/08/08 HTML / CSS
Puccini乌克兰:购买行李箱、女士手袋网上商店
2020/08/06 全球购物
计算机科学技术自荐信
2014/06/12 职场文书
2015年酒店客房部工作总结
2015/04/25 职场文书
蔬果开业典礼发言稿应该怎么写?
2019/09/03 职场文书