数据结构和算法(Python版):利用栈(Stack)实现括号的匹配问题

在平时写程序当中,咱们会常常遇到程序当中括号的匹配问题,也就是在程序当中左括号的数量和右括号的数量必须相等。若是不相等的话则程序必然会报错。Hint:在读取程序的时候,读取的结果确定是左边的全是左括号,右边的全是右括号,也就是必定是“(((( )))))”或者“((((((((((((( )))))))))))))))))”的形式,不多是左右括号互相交互的形式,好比这种:“()()()()))((())((”, 编写过程序的同窗就可以很轻松的知道这是为何,由于先有左后有右,正好这个特性和栈的特性相符合,所以咱们使用栈来解决这个问题,首先定义一个栈的类class:算法

class Stack():

    def __init__(self):
        # 初始化一个空的列表
        self.__list=[]

        # 压栈,也就是把元素从上方添加上去,可是这里我咋感受是从下方添加进去的,顺序反了?
    def push(self,item):
        self.__list.append(item)

    def pop(self):
        return self.__list.pop()# 弹出栈顶的元素,同时删除栈顶的元素

    # 返回栈顶的元素
    def peek(self):
        return self.__list[len(self.__list)-1]# 也就是获取列表当中的最后一个元素

    # 判断栈是否为空
    def is_empty(self):
        return self.__list == []

    # 计算栈的大小
    def size(self):
        return len(self.__list)

    #返回当前栈的列表
    def what(self):
        return self.__list

这也是栈最多见的定义,已经约定俗成了。如今则是算法的实现过程,咱们能够用程序首先读取括号,好比已经给定了括号的字符串“((((( )))))”,咱们将这个字符串传入进行括号匹配的函数当中。若是在循环读取括号当中,读取到了左括号,那么就进行入栈操做。以后左括号读取完毕,再进行右括号的读取操做,每读取到一次右括号,则进行出栈操做,也就是将以前进栈的左括号删除。若是左括号比右括号多,那么栈不管如何也没法为空,则括号不匹配,返回false。若是右括号比左括号更多,那么栈若是已经为空,程序还在读取右括号,说明右括号比左括号更多,这样程序则也返回false。在左括号和右括号的数量相等的时候,程序返回True,思路就是这样的,所以程序的代码以下:app

def pipei(string):
    stack = Stack()
    i=0
    while i<len(string):
        if string[i]=="(":
            stack.push(string[i])
        elif string[i]==")":
            if stack.is_empty():
                return False
            elif not stack.is_empty():
                stack.pop()
        i=i+1
    if  stack.is_empty():
        return True
    else:
        return False


print("开始括号的匹配问题:")
print(pipei("(((())))"))
print(pipei("(((()))))))))))"))

输出为:函数

开始括号的匹配问题
True
False

那么真实的程序还须要咱们本身写一个读取程序的文件,让咱们过滤掉其余符号,只提取出保留括号的字符串,咱们这里再写一个函数类实现这个功能:spa

def tiqukuohao(string):
    i=0
    ls=[]
    while i<len(string):
        if string[i]=="(":
            ls.append(string[i])
        elif string[i]==")":
            ls.append(string[i])
        else:
            pass
        i=i+1

    new_string="".join(ls)#将拿到的列表变成字符串,十分常规的操做
    return new_string

而后调用函数,将一个括号匹配的放入函数,和另外一个括号不匹配的字符串放入函数:code

print(pipei(tiqukuohao("(sdvcsadc(asdasd(a)sdfsdf)asd)asdfas")))
print(pipei(tiqukuohao("sdvcsadc(asdasd(a)sdfsdf)asd)asdfas")))

最后输出为:blog

True
False

得解!ip

相关文章
相关标签/搜索