这个用了普通的循环,数据量不是很大的话效率还是不错的,如果数据比较大的话,换别的方法可能效率会高一点。
思路很简单:以字符串中是否还存在没有匹配过的)作为这个字符串已经处理完毕的标志。
1,读入字符串,并进行处理,把所有不是(和)的字符都转换成空格。
2,从开始扫描字符串,如果扫描到(,记录(的位置,直到扫描到)。
3,如果有与之相匹配的(,即s!=-1,那么,就将这一对括号置为空格,否则,将右括号)置为?
4,如果已经没有了),那么表示字符串已经处理的差不多了,只需要将剩下的(转换为$,整个字符串也就处理完毕了。(可能有人会疑惑为什么不可能没有了(,而还剩下一些),其实这个是在第三步解决的,因为如果已经没有了(,那么,扫描到)的时候,)一定是没有办法被匹配的,所以它会被置为?)
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char c[140] =
{ };
int i, j;
int s = -1, e;
while (cin.getline(c, 140))
{
cout<<c<<endl;
int l = strlen(c);
for (i = 0; i < l; i++)
{
if (c[i] != '(' && c[i] != ')')
c[i] = ' ';
}
while (1)
{
for (i = 0; i < l; i++)
{
if (c[i] == '(')
s = i;
else if (c[i] == ')')
{
e = i;
break;
}
}
if (i == l) //如果已经匹配完所有的)的情况,吧所有的未匹配的(变成$。
{
for (j = 0 ; j < l ; j ++)
{
if (c[j] == '(')
c[j] = '$';
}
break;
}
else if (s == -1) //如果还有)那么,继续循环,,如果没有与)匹配的(,那么把该)变成?
{
c[e] = '?';
}
else //如果有匹配的,那么把两者都变成空格。并且将s置为-1.
{
c[s] = ' ';
c[e] = ' ';
s = -1;
}
}
cout<<c<<endl;
s = -1;
}
return 0;
}