题解 P1241 【括号序列】
貌似就是一个很普通的栈。
按照题目的说法
找到在它左边最靠近它的左括号匹配
也就是说[(]这种要被补成[]()[] 而[)]要被补成[()]
接下来就只要用一下pair和一个标记数组就可以了。
#include<touwenjian.h>
using namespace std;
using namespace std;
stack <pair<int,int> > s1;
char s[200];
int bj[200],n;
int main()
{
scanf("%s",s);
memset(bj,-1,sizeof(bj)); //后面认为匹配的()在bj中体现是1,[]是2,所以赋为其他值
int i,j;
n=strlen(s);
for(i=0;i<n;i++)
{
char t=s[i];
if(t=='('||t=='[') s1.push(make_pair(i,t=='('));
if(t==')'||t==']') if(s1.empty()||s1.top().second!=(t==')')) bj[i]=(t==')'); else s1.pop();
}
while(!s1.empty()) bj[s1.top().first]=s1.top().second,s1.pop();
for(i=0;i<n;i++)
{
if(bj[i]==-1) printf("%c",s[i]);
else if(bj[i]==1) printf("()");
else printf("[]");
}
return 0;
}