定义如下规则序列(字符串):
1.空序列是规则序列;
2.如果S是规则序列,那么(S)和[S]也是规则序列;
3.如果A和B都是规则序列,那么AB也是规则序列。
例如,下面的字符串都是规则序列:
(),[],(()),([]),()[],()[()]
而以下几个则不是:
(,[,],)(,()),([()
现在,给你一些由‘(’,‘)’,‘[’,‘]’构成的序列,你要做的,是补全该括号序列,即扫描一遍原序列,对每一个右括号,找到在它左边最靠近它的左括号匹配,如果没有就放弃。在以这种方式把原序列匹配完成后,把剩下的未匹配的括号补全。
输入:
([()
输出:
()[]()2、题解
int main() {
//()[()))(];算法思路,利用栈,默认规则即为0,如果不规则,再利用数组打上标记,且只要标记左符号就好,然后输出的时候再特殊输出就好,(((()())()[((())]
string str;
cin >> str;
int* state = new int[str.size()]();//初始为0,默认规则,[(]
stack arr;
for (int i = str.size() - 1; i >= 0; i--) {
if (arr.empty()) {//初始化,栈为空时
if (str[i] == ')' || str[i] == ']') {
arr.push(str[i]);
}
else {
state[i] = 1;
}
}
else {//初始化,栈不为空,分为四种情况讨论
if (str[i] == ')' || str[i] == ']')arr.push(str[i] + 'i');
else if (str[i] == '(') {
if (arr.top() == ')')arr.pop();
else {
state[i] = 1;
}//不规则
}
else {
if (arr.top() == ']')arr.pop();
else { state[i] = 1;
}
}
}
}
//栈空,解决了([不匹配的情况
stringstream ss;
for (int i = 0; i < str.size(); ++i) {
if (state[i] == 0)cout << str[i];
else {
if (str[i] == '(')cout << "()";
else cout << "[]";
}
}
delete []state;
cout << endl;
//栈非空,即有)]的剩余,两种方式,一种再走一遍,解决有多余;一种将入栈的数据打上标签
string right;
ss >> right;
cout << right;
stack sta;
state = new int[right.size()]();
for (int i = 0; i


![利用栈解决()[]的对应问题,基于水题——括号序列 利用栈解决()[]的对应问题,基于水题——括号序列](http://www.mshxw.com/aiimages/31/605353.png)
