P1241 括号序列
定义如下规则序列(字符串):
-
空序列是规则序列;
-
如果S是规则序列,那么(S)和[S]也是规则序列;
-
如果A和B都是规则序列,那么AB也是规则序列。
例如,下面的字符串都是规则序列:
()
,[]
,(())
,([])
,()[]
,()[()]
而以下几个则不是:
(
,[
,]
,)(
,())
,([()
现在,给你一些由(
,)
,[
,]
构成的序列,你要做的,是补全该括号序列,即扫描一遍原序列,对每一个右括号,找到在它左边最靠近它的左括号匹配,如果没有就放弃。在以这种方式把原序列匹配完成后,把剩下的未匹配的括号补全。
输入格式
输入文件仅一行,全部由(
,)
,[
,]
组成,没有其他字符,长度不超过100。
输出格式
输出文件也仅有一行,全部由(
,)
,[
,]
组成,没有其他字符,把你补全后的规则序列输出即可。
输入输出样例
输入
([()
输出
()[]()
说明/提示
将前两个左括号补全即可。
标记法
#include <iostream>
#include <string>
using namespace std;
int a[105]; //记录是否配对
int main(){
int i,j,len;
string s;
cin>>s;
len=s.length();
for (i=0; i<len; i++) {
if (s[i] == ')')
for (j=i-1;j>=0;j--)
if (s[j]=='(' && a[j]==0){
a[i]=a[j]=1;
break;
}
else if (s[i]==']')
for (j=i-1;j>=0;j--)
if (s[j]=='[' && a[j]==0){
a[i]=a[j]=1;
break;
}
}
for (i=0;i<len;i++){
if(a[i]==0)
if (s[i]=='(' || s[i]==')') cout<<"()";
else cout<<"[]";
else cout<<s[i];
}
return 0;
}
STL大法
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main(){
stack<int> q;
string s,b;
cin>>s;
int len=s.size();
for (int i=0;i<len;i++) //匹配
if (s[i]=='('){
q.push(i);
b[i]=')';
}else if (s[i]=='['){
q.push(i);
b[i]=']';
}else{
if (q.empty()||b[q.top()]!=s[i])
if (s[i]==')') b[i]='(';
else b[i]='[';
else b[q.top()]=' ',q.pop();
}
for (int i=0;i<len;i++){
if (b[i]=='('||b[i]=='[') cout<<b[i];
cout<<s[i];
if (b[i]==')'||b[i]==']') cout<<b[i];
}
cout<<endl;
}