运行程序时,输入一个包含圆括号、方括号和花括号的字符串,分析其中的圆括号、 方括号和花括号是否正确嵌套和平衡。如果字符串是平衡的,程序将不输出任何内容, 并以EXIT_SUCCESS状态退出。其他情况,将输出一条错误消息,并以失败状态退出。 在扫描字符串遇到(、[或{时,将该该括号入栈;遇到)、]或}时,将从栈中弹出顶 部括号,并检查它是否与字符串中遇到的右括号匹配;如果括号不匹配,或者栈为空, 程序将输出不匹配的括号和遇到的不匹配的括号的索引;如果扫描字符串结束时,栈不 为空,输出信息:open:对应右括号列表。
时间: 2024-03-26 18:40:05 浏览: 144
以下是一个实现该功能的C++程序:
```
#include <iostream>
#include <stack>
#include <unordered_map>
using namespace std;
bool is_left_bracket(char c) {
return c == '(' || c == '[' || c == '{';
}
bool is_right_bracket(char c) {
return c == ')' || c == ']' || c == '}';
}
bool is_same_type(char left, char right) {
static const unordered_map<char, char> match = {
{')', '('},
{']', '['},
{'}', '{'}
};
return match.at(right) == left;
}
int main() {
string str;
getline(cin, str);
stack<pair<char, int>> s; // pair中的int表示左括号在字符串中的位置
for (int i = 0; i < str.length(); i++) {
char c = str[i];
if (is_left_bracket(c)) {
s.push({c, i});
} else if (is_right_bracket(c)) {
if (s.empty() || !is_same_type(s.top().first, c)) {
cout << "Mismatched bracket: " << c << " at index " << i << endl;
if (!s.empty()) {
cout << "Open: ";
while (!s.empty()) {
cout << s.top().first << " at index " << s.top().second << ", ";
s.pop();
}
cout << endl;
}
return EXIT_FAILURE;
} else {
s.pop();
}
}
}
if (!s.empty()) {
cout << "Open: ";
while (!s.empty()) {
cout << s.top().first << " at index " << s.top().second << ", ";
s.pop();
}
cout << endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
```
该程序首先读入一个包含圆括号、方括号和花括号的字符串,然后使用栈来对括号进行匹配。在遍历字符串时,如果遇到左括号,就将其入栈;如果遇到右括号,就从栈中弹出一个左括号,并检查它是否与右括号匹配。如果括号不匹配,或者栈为空,程序将输出错误信息;否则,程序将继续遍历字符串。如果遍历完字符串后,栈不为空,程序将输出信息提示哪些左括号没有匹配的右括号。如果括号全部匹配,程序将以EXIT_SUCCESS状态退出。
阅读全文