栈python(数据结构与算法)----匹配
程序员文章站
2024-01-24 17:34:16
...
题目:
在一个用字符串描述的表达式“{[a+b]/f+(c+d)}”中存在大、中、小括弧,请编写程序,基于栈,实现对输入的一串字符串的依次扫描,并检查括号匹配成功。
示例:
输入样例:{{}}()(hell0){({world}{})}
输出:括号匹配成功
输入样例:{{}}()(hell0){({world}(})}
输出:括号匹配不成功
分析
1假设输入样例为:{{}}()(hell0),简化为{{}}()(),只需将 遇到括号的左边部分压栈即可,此例为:{,{,(,(压栈。
2 判断{},或(),即左括号和右括号匹配,只需弹出栈顶元素与)或}比较是否匹配,为了方便识别对应的括号,提前建立一个字典,使右边的括号为键,左边的括号为值,如下:
class SqStack():
def __init__(self,maxsize):
self.maxsize = maxsize
self.stackElem = [None] * self.maxsize
self.top = 0#指向栈顶元素的下一个储存单元位置
def clear(self):
self.top = 0
def isEmpty(self):
return self.top == 0
def length(self):
return self.top
def peek(self):
if not self.isEmpty():
return self.stackElem[self.top -1]
else:
return None
def push(self,x):
if self.top == self.maxsize:
raise Exception("栈已经满了")
self.stackElem[self.top] = x
self.top += 1
def pop(self):
if self.isEmpty():
return None
self.top -= 1
return self.stackElem[self.top]
def display(self):
for i in range(self.top-1,-1,-1):
print(self.stackElem[i],end=' ')
#练习习题
def isMatched(str1):
dictMatched = {')':'(',
'}':'{'
}
stack = SqStack(20)#建立栈并指定大小
for c in str1:
if c == '(' or c == '{':
stack.push(c)#将左边的括号压栈
if c == ')' or c == '}':
if stack.isEmpty():#栈为空,返回False
return False
if stack.peek() == dictMatched[c]:#判断栈顶元素是否匹配
stack.pop()#匹配成功,弹出栈
else:
return False
s1 = "{{}}()(hello){({world}{})}"
s2 = "{{}}()(hell0){({world}(})}"
print("s1",end=' ')
if isMatched(s1):
print('括号匹配成功')
else:
print('括号匹配不成功')
print("s2",end='')
if isMatched(s2):
print('括号匹配成功')
else:
print('括号匹配不成功')
s1 括号匹配不成功
s2括号匹配不成功
下一篇: 像素理论、视口理论及移动端适配