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 help()函数用法详解
Mar 11 Python
Python使用Flask框架获取当前查询参数的方法
Mar 21 Python
Python实现简单过滤文本段的方法
May 24 Python
关于Django外键赋值问题详解
Aug 13 Python
python+matplotlib绘制饼图散点图实例代码
Jan 20 Python
Python实现matplotlib显示中文的方法详解
Feb 06 Python
详解Python 解压缩文件
Apr 09 Python
python从zip中删除指定后缀文件(推荐)
Dec 05 Python
Django中使用MySQL5.5的教程
Dec 18 Python
Python基于requests库爬取网站信息
Mar 02 Python
Python API len函数操作过程解析
Mar 05 Python
如何利用python创作字符画
Jun 25 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
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
我用php+mysql写的留言本
2006/10/09 PHP
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
php简单浏览目录内容的实现代码
2013/06/07 PHP
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
php中使用base HTTP验证的方法
2015/04/20 PHP
php微信开发之带参数二维码的使用
2016/08/03 PHP
PHP对象相关知识总结
2017/04/09 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
jQuery中after的两种用法实例
2013/07/03 Javascript
javascript firefox 自动加载iframe 自动调整高宽示例
2013/08/27 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
VUE:vuex 用户登录信息的数据写入与获取方式
2019/11/11 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
详解Python中DOM方法的动态性
2015/04/11 Python
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
2015/11/07 Python
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
Python对列表中的各项进行关联详解
2017/08/15 Python
Django实现微信小程序的登录验证功能并维护登录态
2019/07/04 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
python数据抓取3种方法总结
2021/02/07 Python
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
网络技术专业求职信
2014/05/02 职场文书
致地震灾区的慰问信
2015/03/23 职场文书
工地材料员岗位职责
2015/04/11 职场文书
质检员工作总结2015
2015/04/25 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
MySQL创建索引需要了解的
2021/04/08 MySQL
深入解析MySQL索引数据结构
2021/10/16 MySQL
Golang 入门 之url 包
2022/05/04 Golang
Vue深入理解插槽slot的使用
2022/08/05 Vue.js