使用Python实现一个栈判断括号是否平衡


Posted in Python onAugust 23, 2018

栈(Stack)在计算机领域是一个被广泛应用的集合,栈是线性集合,访问都严格地限制在一段,叫做顶(top)。 举个例子,栈就想一摞洗干净的盘子,你每次取一个新盘子,都是放在这一摞盘子的最上头,当你往里面添加盘子的时候,也是放在最上面,处在底部的盘子,你可能永远也用不到。 栈的最常见操作,有如下两个:

push(a) # 压入,将a压入的栈中
pop() # 弹出,将栈的最后一个元素弹出

可是使用Python的列表数据结构,来模拟栈的操作,使用 append 来模拟 push ,使用列表的 pop 来模拟栈的 pop ,但是这样做有一个弊端,那就是列表原本自带的操作方法同样能够使用,可能会造成混乱。

栈的实现 下面就通过借助Python的列表,来自定义一个栈类:

class Stack(object):
  """使用数组实现一个栈"""
  def __init__(self):
    self.data = []
  def push(self, num):
    """压栈操作"""
    self.data.append(num)
  def pop(self):
    """返回从栈中弹出的元素, 当栈为空的时候, 抛出IndexError"""
    return self.data.pop()
  def peek(self):
    """查看当前栈顶的元素, 当栈为空的时候, 抛出IndexError"""
    return self.data[-1]
  def __len__(self):
    """返回栈的长度, 调用len(obj)时会自动调用obj对象的__len__方法"""
    return len(self.data)
  def isEmpty(self):
    """判断栈是否为空"""
    return True if len(self.data)==0 else False
  def clear(self):
    """清空栈"""
    self.data = []
  def __repr__(self):
    """当前对象的表现形式, 在终点直接键入对象时会调用"""
    return 'Stack_' + str(self.data)
  def __str__(self):
    """当前对象的字符串表示, 使用print(obj)时会调用"""
    return 'Stack_' + str(self.data)

以上代码实现了一个简单的基于列表的栈。

栈的应用 栈应用的一个很典型的例子,就是检查括号是否匹配。 例如: 每一个开始的 [ 后面,都应该跟着一个位置正确的 ] ,并且每一个 ( 后面,也应该跟着一个位置正确的结束的 ) .

(...)...(...)
(...)...(...
)...((...)
def isBalance(text):
  """栈的应用,检查括号是否平衡"""
  result_stack = Stack()
  for i in text:
    if i in ['{', '[', '(']:
      result_stack.push(i)
    elif i in ['}', ']', ')']:
      # 遇到结束括号的情况
      if result_stack.isEmpty():
        # 如果当前栈为空, 不匹配,返回False
        return False
      chFromStack = result_stack.pop()
      if not ((chFromStack == '{' and i == '}' )
          or (chFromStack == '[' and i == ']')
          or (chFromStack == '(' and i == ')')):
        # 如果不满足匹配条件, 则返回False
        return False
  # 遍历结束后, 如果结果栈为空, 则代表括号匹配, 栈不为空, 括号不匹配
  return result_stack.isEmpty()

补充:Python中的栈

在python中,个人理解为栈可以用列表来代替

服从FILO:First In Last Out

其中入栈为(利用append函数)

stack = []
stack.append(<item>)

出栈为(利用pop函数)

stack.pop(-1) #stack.pop()也可

服从FIFO:First In First Out

入栈为:

stack = []
stack.append(<item>)

出栈为:

stack.pop(0)

总结

以上所述是小编给大家介绍的使用Python实现一个栈判断括号是否平衡,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python装饰器使用方法实例
Nov 21 Python
举例区分Python中的浅复制与深复制
Jul 02 Python
python中pandas.DataFrame排除特定行方法示例
Mar 12 Python
Python使用filetype精确判断文件类型
Jul 02 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
Aug 05 Python
Python中asyncio与aiohttp入门教程
Oct 16 Python
对pandas的算术运算和数据对齐实例详解
Dec 22 Python
Python 列表去重去除空字符的例子
Jul 20 Python
Python socket 套接字实现通信详解
Aug 27 Python
Python实现打印实心和空心菱形
Nov 23 Python
python实现图书馆抢座(自动预约)功能的示例代码
Sep 29 Python
python re的findall和finditer的区别详解
Nov 15 Python
Python wxpython模块响应鼠标拖动事件操作示例
Aug 23 #Python
示例详解Python3 or Python2 两者之间的差异
Aug 23 #Python
Django 限制用户访问频率的中间件的实现
Aug 23 #Python
浅谈Django的缓存机制
Aug 23 #Python
如何在python字符串中输入纯粹的{}
Aug 22 #Python
关于python列表增加元素的三种操作方法
Aug 22 #Python
Python Learning 列表的更多操作及示例代码
Aug 22 #Python
You might like
php获取某个目录大小的代码
2008/09/10 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
Yii实现简单分页的方法
2016/04/29 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
2019/02/15 PHP
JS解密入门 最终变量劫持
2008/06/25 Javascript
使用原生javascript创建通用表单验证——更锋利的使用dom对象
2011/09/13 Javascript
JavaScript实现简单的时钟实例代码
2013/11/23 Javascript
jquery each的几种常用的使用方法示例
2014/01/21 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
详解js中class的多种函数封装方法
2016/01/03 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
vuejs+element-ui+laravel5.4上传文件的示例代码
2017/08/12 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
详解vue中localStorage的使用方法
2018/11/22 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
Python使用Paramiko模块编写脚本进行远程服务器操作
2016/05/05 Python
Python中二维列表如何获取子区域元素的组成
2017/01/19 Python
python 实现A*算法的示例代码
2018/08/13 Python
tensorflow实现逻辑回归模型
2018/09/08 Python
pandas 将索引值相加的方法
2018/11/15 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
修改Pandas的行或列的名字(重命名)
2019/12/18 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
道路交通事故人身损害赔偿协议书
2014/11/19 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书
伏羲庙导游词
2015/02/09 职场文书
债务纠纷起诉书
2015/05/20 职场文书
交通事故被告答辩状
2015/05/22 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书