题目大意:给出四种括号,这四个之间可以互相改变,让你看需要变几次才能让括号都匹配。即'(' 配 ')''<'配‘>'……
但不能把左括号改成右括号,或者把右括号改成左括号。
思路:因为括号的匹配是最外层与最外层匹配,里层和里层匹配。可以考虑栈的先进后出模型。
代码如下:
#include<iostream>
#include<stdio.h>
#include<iomanip>
#include<stack>
using namespace std;
int main(void)
{
stack<char> s;
char ch;
int sum=0,flag=1,left=0,right=0;
cin>>ch;
while(ch!='\n')
{
if(ch=='['||ch=='{'||ch=='('||ch=='<')
{
s.push(ch);
left++;
}
else if(!s.empty())
{
switch(ch)
{
case ']':
if((s.top())=='[')
{
s.pop();
}
else
{
sum++;
s.pop();
}
break;
case '}':
if((s.top())=='{')
{
s.pop();
}
else
{
sum++;
s.pop();
}
break;
case '>':
if((s.top())=='<')
{
s.pop();
}
else
{
sum++;
s.pop();
}
break;
case ')':
if((s.top())=='(')
{
s.pop();
}
else
{
sum++;
s.pop();
}
break;
default:flag=0;break;
}
right++;
}
else
{
right++;
flag=0;
}
scanf("%c",&ch);
}
if(left!=right)//这里需要留心一下,如果左右括号的数量都不相等,无论怎么改都不可能会配对成功
flag=0;
if(flag==1)
cout<<sum<<endl;
else
cout<<"Impossible"<<endl;
return 0;
}