题意:给定一个只有'{' '[' '(' '<'开字符和'}' ']' ')' '>'闭字符的字符串,你可以将开字符互相转化,闭字符互相转化,要求得到一个括号匹配的串。若可以输出最少转化次数,反之输出Impossible。
记录左右括号的数量,若不相等,则说明没有
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
int main()
{
stack<char> s;
char c[1000010];
int i,l;
while(scanf("%s",c)!=EOF)
{
int ans=0,lift=0;;
l=strlen(c);
for(i=0;i<l;i++)
{
if(c[i]=='{'||c[i]=='<'||c[i]=='['||c[i]=='(')
{
s.push(c[i]);
lift++;
}
else
{
if(c[i]=='}')
{
if(s.empty())
break;
else if(s.top()=='{')
s.pop();
else
{
ans++; s.pop();
}
}
else if(c[i]==']')
{
if(s.empty())
break;
else if(s.top()=='[')
s.pop();
else
{
ans++; s.pop();
}
}
if(c[i]=='>')
{
if(s.empty())
break;
else if(s.top()=='<')
s.pop();
else
{
ans++; s.pop();
}
}
if(c[i]==')')
{
if(s.empty())
break;
else if(s.top()=='(')
s.pop();
else
{
ans++;
s.pop();
}
}
}
}
if(double(l)/2!=double(lift))
printf("Impossible\n");
else if(i==l)
printf("%d\n",ans);
else printf("Impossible\n");
}
return 0;
}
完成配对。