裸的括号匹配,遇到左括号时将其压进栈,遇到右括号判断是否空栈,空栈则不合法,非空栈则退栈。这里多个记录下标的步骤,再开数组记录一下非法括号的下标即可。
(有点坑的是输出第二行原来字符串时要输出空格,不能不输出,审题的重要性~,我用vector模拟栈,本质一样的
//
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(x,y) memset(x,y,sizeof(x))
#define all(v) v.begin() , v.end()
#define pb(v) push_back(v)
#define INF 0x3f3f3f3f
#define int long long
#define lson p*2,l,mid
#define rson p*2+1,mid+1,r
//#define int long long
typedef long long ll;
char s[205];
char res[205];
vector <int > ans;
signed main()
{
//!!!!!!!!!!!!!!!!!!!!!!
// freopen("data.txt","r",stdin);
//!!!!!!!!!!!!!!!!!!!!!!
// IOS;
while( cin>>(s+1) )
{
cout<<(s+1)<<endl;
int cnt=0;
int len = strlen(s+1);
_for(i,1,len)
{
if( s[i] == '(') ans.pb(i);
else if( s[i] == ')')
{
if( !ans.empty())//有左括号就退栈
{
ans.pop_back();
}
else//当前右括号无法匹配
{
res[i] = '?';
}
}
}
//处理栈里剩余左括号
while( !ans.empty() )
{
int x = ans.back();
res[x] = '$';
ans.pop_back();
}
_for(i,1,len)
if(res[i]) cout<<res[i];
else cout<<" ";
cout<<endl;
//多case要清空原来的存储
mst(s,0);
mst(res,0);
ans.clear();
}
}