zoukankan      html  css  js  c++  java
  • 数据结构和算法(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,思路就是这样的,因此程序的代码如下:

    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

    那么真实的程序还需要我们自己写一个读取程序的文件,让我们过滤掉其他符号,只提取出保留括号的字符串,我们这里再写一个函数类实现这个功能:

    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

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

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

    最后输出为:

    True
    False

    得解!

  • 相关阅读:
    Python进程池multiprocessing.Pool的用法
    基于opencv的车牌提取项目
    Srapy 爬取知乎用户信息
    Scrapy框架简介及小项目应用
    豆瓣爬取图书标签
    CSS选择器使用
    关于 urlencode 的使用和 json 模块的介绍
    urllib库使用方法
    猫眼电影的各种爬取方法
    淘宝商品信息爬取
  • 原文地址:https://www.cnblogs.com/geeksongs/p/12849985.html
Copyright © 2011-2022 走看看