Problem J: 括号匹配问题
Problem Description
在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标注,不能匹配的右括号用"?"标注。
Input Description
输入包括多组数据,每组数据一行,包含一个字符串,只包含左右括号和大小写字母,字符串长度不超过100。
注意:cin.getline(str,100)最多只能输入99个字符!
Output Description
对每组输出数据,输出两行,第一行包含原始输入字符,第二行由"$","?"和空格组成,"$"和"?"表示与之对应的左括号和右括号不能匹配。
Sample Input
bge)))))))))
((IIII))))))
()()()()(uuu
))))UUUU((()
Sample Output
bge)))))))))
?????????
((IIII))))))
????
()()()()(uuu
$
))))UUUU((()
???? $$
Hint
算法思想:
括号匹配是典型的栈的应用,因此可以采用链栈,思路如下:
(1)第一次遍历输入字符串,
1.是左括号,则入栈,同时标记数组的相应位置置空格
2.是右括号,则检测栈是否为空,不为空,则判断有对应的左括号,同时出栈;为空,则没有对应的左括号,标记数组置‘?’
(2)第二次遍历输入字符串,
1.是右括号,则入栈。
2.是左括号,则检测栈是否为空,不为空,则判断有对应的右括号,同时出栈;为空,则没有对应的左括号,标记数组置‘$’。
ac代码:
1 # 本题易错,List是可变的,传到函数里是指针,所以赋值给新的变量保存也会修改它本身的值,只能拷贝保存 2 # 找左括号无法匹配要逆转列表看入栈的顺序 3 # 顺序存储 4 class Stack(object): 5 # 初始化一个栈 6 def __init__(self, size=100): 7 self.stack = [] 8 self.size = size 9 self.top = -1 10 11 # 判断堆栈是否为空 12 def isEmpty(self): 13 return self.top == -1 14 15 # 判断栈是否已满 16 def is_full(self): 17 return self.top + 1 == self.size 18 19 # 入栈操作 20 def pushStack(self, val): 21 if self.is_full(): 22 raise Exception("Stack is full") 23 else: 24 self.top += 1 25 self.stack.append(val) 26 27 # 出栈操作 28 def popStack(self): 29 if self.isEmpty(): 30 raise Exception("Stack is empty") 31 else: 32 self.top -= 1 33 self.stack.pop() 34 35 def func(): 36 while True: 37 try: 38 x = [] 39 x = input() 40 x = list(x) 41 Match(x) 42 except EOFError: 43 break 44 def Match(line): 45 t = [] 46 t = line.copy() 47 print(''.join(t)) 48 # 实例化一个栈 49 s = Stack() 50 j = 0 51 # 找右括号是否匹配 52 for i in line: 53 t[j] = ' ' 54 if i=='(': 55 s.pushStack(i) 56 if i==')': 57 if s.isEmpty(): 58 t[j] = '?' 59 else: 60 s.popStack() 61 j += 1 62 # 找左括号是否匹配,注意不能拆开比较,括号有左右之分 63 w = Stack() 64 flag = 0 65 length = len(line) 66 j = 0 67 m = line[::-1] 68 for i in m: 69 if i == ')': 70 w.pushStack(i) 71 if i == '(': 72 if w.isEmpty(): 73 t[length-1-j] = '$' 74 else: 75 w.popStack() 76 j += 1 77 print(''.join(t)) 78 if __name__ == '__main__': 79 func()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构