Description
You are given string s consists of opening and closing brackets of four kinds<>,{},[],(). There are two types of brackets: opening and closing. You can replace any bracket by another of the same type. For example, you can replace< by the bracket{, but you can't replace it by ) or>.
The following definition of a regular bracket sequence is well-known, so you can be familiar with it.
Let's define a regular bracket sequence (RBS). Empty string is RBS. Let s1 and s2 be a RBS then the strings<s1>s2,{s1}s2,[s1]s2,(s1)s2 are also RBS.
For example the string "[[(){}]<>]" is RBS, but the strings "[)()" and "][()()" are not.
Determine the least number of replaces to make the string s RBS.
Input
The only line contains a non empty string s, consisting of only opening and closing brackets of four kinds. The length ofs does not exceed106.
Output
If it's impossible to get RBS from s printImpossible.
Otherwise print the least number of replaces needed to get RBS from s.
Sample Input
[<}){}
2
{()}[]
0
]]
Impossible
就是一串字符串,只包含四种括号(),{}, [],<>,左括号可以互相转化,<,{,[,(,右括号可以互相转化,>,},],),但左右不能转化,最后问所有括号配对最少需要多少步,不能就输出impossible
ps:括号是就近匹配,否则就是这种情况[( ]),这样配对是不行的
#include<cstdio>
#include<cstring>
#include<stack>
#include<queue>
#include<algorithm>
using namespace std;
char s[1000010];
char ope(char a){
if(a=='{'){
return '}';
}
if(a=='<'){
return '>';
}
if(a=='['){
return ']';
}
if(a=='('){
return ')';
}
}
int main(){
stack <char> sta;
scanf(" %s", s);
int n = strlen(s);
int ans = 0;
for(int i = 0;i < n;i++){//左括号就进栈
if(s[i] == '<' || s[i] == '{'||s[i] == '[' || s[i] == '('){
sta.push(s[i]);
}
else if(!sta.empty()){//如果是右括号,且栈非空,
if(ope(sta.top()) != s[i]){//就近匹配,对于栈,最近的就是最后进入的,也是栈顶元素
ans++;
}
sta.pop();
}
else{//空栈即右括号多余,就是不能匹配
printf("Impossible\n");
return 0;
}
}
if(!sta.empty()){//有多余的左括号,就是不能匹配
printf("Impossible\n");
}
else{
printf("%d\n", ans);
}
return 0;
}