用python实现,不要导入额外的包:【问题描述】 编写一个程序,用于对C源程序进行括号匹配检查,并将检查结果输出到文件中。 程序应检查输入源程序中左右大括号、小括号的个数是否相等,并且符合C语言语法规定的括号嵌套规则,不得交叉嵌套。输入文件最长不超过500个字符。 本程序只检查括号是否匹配,不用对输入源程序中的其它语法成份进行检查。 【输入文件】 输入文件为当前目录下的check.in,是一段任意的C程序。 【输出文件】 输出文件为当前目录下的check.out。该文件只有一行,是一个单词"True"或"False"。如果没有括号匹配错误则输出"True",否则输出"False"。 【样例输入】 输入文件check.in的内容如下: static void PrintArr (int *p) { int i = 0; while (*(p+i)) printf ("%4d", *(p + i)); i++; } printf ("\r\n"); return; } 【样例输出】 输出文件check.out内容如下: False 【样例说明】 在输入的源程序中,while语句缺少一个左大括号,输出为False。
时间: 2024-01-08 11:02:19 浏览: 70
以下是一个简单的实现:
```python
with open('check.in', 'r') as f:
code = f.read()
stack = []
for i, char in enumerate(code):
if char in ('{', '(', '['):
stack.append((char, i))
elif char in ('}', ')', ']'):
if not stack:
with open('check.out', 'w') as f:
f.write('False')
break
opening_char, opening_index = stack.pop()
if (opening_char == '{' and char != '}') \
or (opening_char == '(' and char != ')') \
or (opening_char == '[' and char != ']'):
with open('check.out', 'w') as f:
f.write('False')
break
else:
with open('check.out', 'w') as f:
f.write('True')
```
这个实现首先打开输入文件 `check.in` 并读取其内容。然后,它遍历代码中的每个字符,如果遇到左括号,则将其压入栈中,并记录其索引;如果遇到右括号,则弹出栈顶元素,并检查该右括号是否与栈顶元素所记录的左括号匹配。如果两个括号不匹配,则输出 `False` 并退出循环。如果遍历完整个代码都没有发现括号匹配错误,则输出 `True`。
阅读全文