python实现栈(含括号匹配)

python对栈的实现

什么是栈?

  1. 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾(栈顶)进行插入和删除操作的线性表。
  2. 栈的特性:先入后出(FILO,First In Last Out), 先入栈的会被后入栈的压到下边,因为只有一个出入口,所以,后入栈的在最上边要先出栈,一般只有 push(入栈),pop(出栈)两种操作

在这里插入图片描述

用python实现栈(version 3.7.2)

  1. python最直观的特点就是简洁,因此实现一个简单的栈只需几行代码
  2. 笔者为了轻便,没有在对栈的操作之前做一些类似非空判断的操作来增加健壮性,因此使用时要多注意出栈操作时栈是否已经为空
  3. 以列表尾部作为栈顶 出栈和入栈的时间复杂度都是O(1),因此我们以列表尾部作为栈顶
  4. 关于为什么复杂度是O(1)可以看我另一篇文章
# 以列表尾部作为栈顶 出栈和入栈的时间复杂度都是O(1)
# 以列表头作为栈顶,出栈和入栈的时间复杂度都是O(n)
class Stack:
    def __init__(self):
        self.items = []
	#判断栈是否为空
    def isEmpty(self):
        return self.items == []
	# 入栈操作,将数据压入栈顶,也就是追加到列表尾部
    def push(self, item):
        self.items.append(item)
	# 出栈
    def pop(self):
        return self.items.pop()
	# 查看栈顶的元素,注意栈为空时操作将报错
    def peek(self):
        return self.items[len(self.items)-1]
	# 返回栈的当前大小,也就是当前栈中元素的个数
    def size(self):
        return len(self.items)

接着用上面的栈来实现括号匹配

  1. 栈很适合被用来处理一些成双配对的操作
  2. 先实例化一个栈的对象
  3. 遍历括号字符串并判断当前括号是否为左半边的类型,如果是就入栈(大白话就是将左半边的括号入栈,等待右半边的括号来把它领走)
  4. 如果不是左半边括号,则一定是右半边的括号(前提是数据输入按照规范,不存在除处理的几种括号之外的字符)
  5. 将右半边的括号与栈顶的括号进行匹配,如果配对则对栈顶的括号执行出栈操作(抱得美人归),否则此串不符合要求(右括号来了,发现在等待的左括号不是想要的类型,返回False)
  6. 注意栈为空的情况(右半边括号来了,发现左半边括号没有在这等它,气急败坏返回False)
  7. 所有右括号找到匹配的左括号,圆满结局返回True
  8. 可以尝试多加几种括号的类型
from Stack import *


def parCheckUpgrade(symbolString):
    '''
    :param symbolString: 需要进行验证的字符串(也就是括号序列)
    :return: 验证结果
    '''
    s = Stack()
    balanced = True
    index = 0
    while index < len(symbolString) and balanced:
        symbol = symbolString[index]
        if symbol in "({[<":
            s.push(symbol)
        else:
            if s.isEmpty():
                balanced = False
            else:
                top = s.peek()
                if matches(top, symbol):
                    s.pop()
                else:
                    return False
        index = index + 1
    if balanced and s.isEmpty():
        return True
    else:
        return False


def matches(start, end):
    '''
    用来判断括号是否匹配的
    :param start: 左半边括号
    :param end: 右半边括号
    :return: 是否是同对括号
    '''
    opens = "({[<"
    closer = ")}]>"
    return opens.find(start) == closer.find(end)


# print(parCheck("((()()))"))
print(parCheckUpgrade("{<>}<>{[[][{[]}][]]()}"))

如有错误还望指出
允许转载但请注明出处

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值