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 相关文章推荐
以Flask为例讲解Python的框架的使用方法
Apr 29 Python
详解Django框架中用户的登录和退出的实现
Jul 23 Python
深入浅析python中的多进程、多线程、协程
Jun 22 Python
django创建自定义模板处理器的实例详解
Aug 14 Python
Python数据结构与算法之图结构(Graph)实例分析
Sep 05 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 Python
python使用Pycharm创建一个Django项目
Mar 05 Python
对python中执行DOS命令的3种方法总结
May 12 Python
5款Python程序员高频使用开发工具推荐
Apr 10 Python
Django缓存系统实现过程解析
Aug 02 Python
django2.2安装错误最全的解决方案(小结)
Sep 24 Python
python多线程方法详解
Jan 18 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
杏林同学录(六)
2006/10/09 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
php中创建和调用webservice接口示例
2014/07/25 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
深入理解javaScript中的事件驱动
2013/05/21 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
JS实现把鼠标放到链接上出现滚动文字的方法
2016/04/06 Javascript
jQuery基于ID调用指定iframe页面内的方法
2016/07/06 Javascript
原生js获取left值和top值的三种方法
2017/08/02 Javascript
vue-router 权限控制的示例代码
2017/09/21 Javascript
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
webpack源码之loader机制详解
2018/04/06 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
vue el-table实现自定义表头
2019/12/11 Javascript
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
Python递归遍历列表及输出的实现方法
2015/05/19 Python
python 读写中文json的实例详解
2017/10/29 Python
python如何修改装饰器中参数
2018/03/20 Python
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
python英语单词测试小程序代码实例
2019/09/09 Python
python数据爬下来保存的位置
2020/02/17 Python
python selenium xpath定位操作
2020/09/01 Python
CSS+jQuery+PHP+MySQL实现的在线答题功能
2015/04/25 HTML / CSS
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
html如何对span设置宽度
2019/10/30 HTML / CSS
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
中专自我鉴定范文
2013/10/16 职场文书
会员活动策划方案
2014/08/19 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
2015大学生实训报告
2014/11/05 职场文书
新郎新娘答谢词
2015/01/04 职场文书
严以律己学习心得体会
2016/01/13 职场文书
Echarts如何重新渲染实例详解
2022/05/30 Javascript
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers