题目
题解思路
各种前缀后缀中缀表达式都可以由栈来解决。
每个括号需要找到他对应的括号。我们将左括号压栈,当遇到右括号时出栈。将括号的编号压栈!
此时我们遵循括号就近匹配,利用先进后出来推出的。(这个特性有助于推出答案)
当遇到无法处理(栈中没有元素来匹配)的括号时前压栈,由于我们只能进行一次操作,所以最后栈中只能存在2个无法匹配的元素。
由于每种情况不同,我们进行分类特判处理。
))
左括号无法匹配,此时我们现在左括号前的任意与左括号相同的元素来替换,因为左括号右边的元素已经被匹配。(参考前面的特性)
((
右括号无法匹配 ,同理从右括号往后找。
)(
无法处理
如果没写过类似的题,真的搞不明白。
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <stack>
using namespace std;
const int INF = 0x3f3f3f3f;
int main ()
{
ios::sync_with_stdio(false);
int n;
string s;
stack <int> q;
cin>>n;
cin>>s;
for (int i = 0 ; i < n ; i++ )
{
if ( s[i] == '(')
q.push(i);
else
{
if (!q.empty() && s[q.top()] == '(')
{
q.pop();
}else
q.push(i);
}
}
if (q.size() == 2 )
{
int ans = 0 ;
int d2 = q.top();
q.pop();
int d1 = q.top();
q.pop();
if ( s[d1] == ')' && s[d2] == '(')
cout<<"0\n";
else if ( s[d1] == ')' && s[d2] == ')')
{
for (int i = 0 ; i <= d1 ; i++ )
{
if ( s[i] == ')')
ans++;
}
cout<<ans<<"\n";
}
else
{
for (int i = d2 ; i < n ; i++ )
{
if ( s[i] == '(')
ans++;
}
cout<<ans<<"\n";
}
}else
{
cout<<"0\n";
}
return 0 ;
}