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中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
Jan 10 Python
Python实现JSON反序列化类对象的示例
Jan 31 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
Jun 13 Python
python全栈要学什么 python全栈学习路线
Jun 28 Python
pandas对dataFrame中某一个列的数据进行处理的方法
Jul 08 Python
TensorFlow2.0:张量的合并与分割实例
Jan 19 Python
在python里使用await关键字来等另外一个协程的实例
May 04 Python
tensorflow 动态获取 BatchSzie 的大小实例
Jun 30 Python
Pycharm github配置实现过程图解
Oct 13 Python
Python matplotlib 利用随机函数生成变化图形
Apr 26 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
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
jQuery中add实现同时选择两个id对象
2010/10/22 Javascript
javascript两种function的定义介绍及区别说明
2013/05/02 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
JS图片无缝、平滑滚动代码
2014/03/11 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
2015/03/11 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
react实现pure render时bind(this)隐患需注意!
2017/03/09 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
2020/04/24 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
简单谈谈Python中的json与pickle
2017/07/19 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
​如何愉快地迁移到 Python 3
2019/04/28 Python
Python数据类型之Dict字典实例详解
2019/05/07 Python
python selenium自动化测试框架搭建的方法步骤
2020/06/14 Python
django中嵌套的try-except实例
2020/05/21 Python
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
JD Sports瑞典:英国领先的运动时尚商店
2018/01/28 全球购物
TheFork葡萄牙:欧洲领先的在线餐厅预订平台
2019/05/27 全球购物
21岁生日感言
2014/02/27 职场文书
房产买卖委托公证书
2014/04/04 职场文书
家长通知书家长评语
2014/04/17 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
大学生英文求职信范文
2015/03/19 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
项目战略合作意向书
2015/05/08 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
OpenCV-Python实现油画效果的实例
2021/06/08 Python