再过半个月期末了,开始复习.

首先,对于给出的一系列小括号,到底怎样算匹配?

也就是“()”左括号在左边,右括号在右边。

即如果“)(”字符串存在,也认为括号是不匹配的。

对于这个问题,可以使用栈的数据结构来解决,栈的定义在下方class Stack:

然后考虑匹配的算法,由于我们输入的第一个一定是左括号(如果是右括号则一定无法匹配),我们可以将输入的字符串中的左括号都压入栈中,然后看见右括号再把栈中的左括号弹出一个代表匹配成功,将字符串遍历完毕之后,如果左括号都被弹出,则说明整个输入的字符串括号是匹配的。

上述算法有一定的问题,如,我们输入的字符串中,右括号多于左括号,势必所有的左括号都会被弹出,并且有若干右括号得不到匹配,因而引入了一个布尔型变量balanced。

balanced的作用就是判断右括号是否多余了左括号,在字符串里,如果出现这样的形式,如:

s = ”()())“也就是说,一个右括号前面的左括号全部都已经匹配了,s[0]-s[4],s[2]-s[3],则s[1]就得不到匹配了(右括号一定在相应的左括号右边),此时我们可以理解成,此时左括号的栈已经”欠债“了,有光棍右括号一定找不到对应的左括号小姐,这个平衡被打破,此时balanced的值就转为False,while循环已经没有继续的必要,直接进入到if的判断中,得到false。

if的判断有两个条件,如果这个字符串是匹配的,左括号的栈一定为空,而且没有光棍右括号,是否为空用isEmpty方法判断,,是否有多出来的右括号由balanced这个布尔型变量确定,至此我们就完成了小括号的匹配。

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)
    
def parChecker(symbolString):
    s = Stack()
    i=0
    balanced = True
    while i<len(symbolString) and balanced:
        if symbolString[i]=='(':
            s.push("(")
        else:
            if not s.isEmpty():
                s.pop()
            else:
                balanced = False#此时栈欠债啦
        i=i+1
    if s.isEmpty() and balanced:
        return True
    else:
        return False