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()

 

posted @ 2023-04-28 19:13  hangsingplus  Views(43)  Comments(0Edit  收藏  举报