请编写程序判断一个包含“(”和“)”的括号序列是否匹配。如匹配则输出Match;如不匹配,计算出使该序列变为匹配序列所需添加的最少括号数目(只允许在该序列开始和结尾处添加括号),并输出经添加最少括号后得到的合法匹配序列。 输入格式: 输入为若干行,每行一个字符串,包含不超过10 5 个括号。输入行数不超过10行。 输出格式: 对于输入的每个括号序列输出1行或2行信息。若输入的括号序列匹配,则输出Match。若不匹配,则输出分为2行,第1行为一个整数,表示将该序列变为匹配序列所需添加的最少括号数目,
时间: 2024-03-15 20:44:37 浏览: 84
数据结构括号匹配程序(栈方法)
5星 · 资源好评率100%
下面是一个用C++实现的括号匹配程序,能够判断括号序列是否匹配,并可以输出匹配序列或计算最少需要添加的括号数目:
```
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
// 判断括号序列是否匹配
bool isMatched(string s) {
stack<char> st; // 用栈来保存左括号
// 遍历字符串中的每个字符
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') {
st.push('('); // 如果是左括号,入栈
} else if (s[i] == ')') {
if (st.empty()) {
return false; // 如果栈为空,说明没有左括号与之匹配,返回false
} else {
st.pop(); // 如果栈不为空,说明有左括号与之匹配,将左括号出栈
}
}
}
return st.empty(); // 如果栈为空,说明所有左括号都匹配了,返回true;否则返回false
}
// 计算最少需要添加的括号数目,并输出添加后的匹配序列
void compute(string s) {
stack<char> st; // 用栈来保存左括号
int left = 0, right = 0; // 分别表示左括号和右括号的个数
// 遍历字符串中的每个字符
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') {
st.push('('); // 如果是左括号,入栈
left++;
} else if (s[i] == ')') {
if (st.empty()) {
right++; // 如果栈为空,说明没有左括号与之匹配,右括号数加1
} else {
st.pop(); // 如果栈不为空,说明有左括号与之匹配,将左括号出栈,左括号数加1
left++;
}
}
}
int need = left - st.size() - right; // 计算需要添加的括号数目
cout << need << endl;
if (need > 0) {
string res = "";
while (!st.empty()) {
res += st.top();
st.pop();
}
reverse(res.begin(), res.end()); // 将栈中剩余的左括号出栈,并将其翻转,得到匹配序列
for (int i = 0; i < need; i++) {
cout << '(';
}
cout << res << string(right, ')') << endl; // 输出添加括号后的匹配序列
}
}
int main() {
string s;
while (cin >> s) {
if (isMatched(s)) {
cout << "Match" << endl;
} else {
compute(s);
}
}
return 0;
}
```
程序思路:
首先,我们用栈来保存左括号,遍历字符串中的每个字符,如果是左括号,就将其入栈;如果是右括号,就从栈中弹出一个左括号,表示它们匹配。如果栈为空,说明没有左括号与之匹配,返回false;如果遍历完整个字符串后,栈不为空,说明有左括号没有被匹配,返回false;否则返回true。
接着,我们计算最少需要添加的括号数目。具体地,我们用两个变量left和right来分别表示左括号和右括号的个数。遍历字符串中的每个字符,如果是左括号,就将left加1;如果是右括号,就从栈中弹出一个左括号,并将left加1;如果栈为空,说明没有左括号与之匹配,将right加1。最后,需要添加的括号数目就是left减去栈中剩余的左括号数目减去right。如果需要添加的括号数目大于0,就先将栈中剩余的左括号出栈,并将其翻转,得到匹配序列;然后在该序列的开始处添加需要添加的左括号,最后在该序列的结尾处添加需要添加的右括号,得到添加括号后的匹配序列。
完整的程序包括两个函数,一个用来判断括号序列是否匹配,一个用来计算最少需要添加的括号数目,并输出添加后的匹配序列。在主函数中,我们可以循环读入若干个包含括号的字符串,对每个字符串分别进行判断和计算。如果是匹配的,直接输出Match;否则输出需要添加的括号数目和添加后的匹配序列。
阅读全文