【Openjudge】括号匹配

这个用了普通的循环,数据量不是很大的话效率还是不错的,如果数据比较大的话,换别的方法可能效率会高一点。

思路很简单:以字符串中是否还存在没有匹配过的)作为这个字符串已经处理完毕的标志。

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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值