D(选做题) 括号匹配 (10 分)
请编写程序判断一个包含“(”和“)”的括号序列是否匹配。如匹配则输出Match;如不匹配,计算出使该序列变为匹配序列所需添加的最少括号数目(只允许在该序列开始和结尾处添加括号),并输出经添加最少括号后得到的合法匹配序列。
输入格式:
输入为若干行,每行一个字符串,包含不超过10
5
个括号。输入行数不超过10行。
输出格式:
对于输入的每个括号序列输出1行或2行信息。若输入的括号序列匹配,则输出Match。若不匹配,则输出分为2行,第1行为一个整数,表示将该序列变为匹配序列所需添加的最少括号数目,第2行为一个字符串,表示经添加最少括号后得到的合法匹配序列。
输入样例:
(())()
)(
()))((
输出样例:
Match
2
()()
4
((()))(())`
#include
using namespace std;
int flag;//神奇的标记位
class node {
public:
char t;
node* next;
node(char s) {
t = s;
next = NULL;
}
};
// ) 扣分 ( 加分
//输入的时候就在动态处理了
int main() {
string s;
while (cin>>s) {
int ans = 0,t=0;
node* solider = new node(’ '); //哨兵位
node* rear = solider;
char n=s[t];
while (n != ‘\0’) {
n = s[t];
if (n == '\0')break;
//cout << "N" << n;
t++;
rear->next = new node(n);
rear = rear->next;
if (n == '(') flag++;
else if(n==')') flag--;
while (flag < 0) {//插入到中间
node* cur = solider->next;
node* now = new node('(');
ans++;
solider->next = now;
now->next = cur;
flag++;
}
}
if (ans == 0) {
cout << "Match" << endl;
continue;
}
//cout << "flag" << flag;
while (flag > 0) {
flag--;
rear->next = new node(')');
ans++;
rear = rear->next;
}
node* head = solider->next;
cout << ans << endl;
while (head != NULL) {
cout << head->t;
head = head->next;
}
cout << endl;
}
}`