栈python(数据结构与算法)----匹配

题目:

在一个用字符串描述的表达式“{[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括号匹配不成功

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值