C语言检查字符串中的括号是否良好配对

问题描述:编写一个函数检查字符串中的括号是否良好配对,如果是,返回1,否则,返回0。这里的括号包括圆括号()、方括号【】、花括号{}。

例如输入“(ab(c(d)))”,返回1;输入“({[}])”,返回0。

这道题如果要考虑括号配对错误的情况,将比较复杂,比如某个括号没有反向的另一个括号配对,或者不同类型的括号相互穿插。并没有一个比较好的方法判断某一个或几个括号是否配对错误。所以我们需要改换思路,现在检测良好配对的括号(这是相较简单的,只要一个左括号和一个右括号之间没有其他括号即可),一旦发现,就不用再检测,进而判断字符串的其他部分,如此重复,通过检测字符串中是否都是良好配对的括号来实现目的。

对字符串的检测顺序十分重要,以上思路,需要先找到最小的(或者说最先出现的)良好配对的括号,这时就可以把它们以及中间的字符赋为非括号(比如‘0’),然后重复此步骤。当所有操作结束,检测字符串中是否留有括号,否,则全部良好配对,是,则剩下的就是配对错误的。

完整代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int isValid(char str[])
{
	int i, j, k, flag, condition;
	size_t n = strlen(str);
	do  //由于以下代码的历遍顺序,无法一次去除多组良好配对的括号
		//用do while循环判断,若执行了一次,就有可能可以继续执行
		//每次将condition初始化为0,执行了赋为1,否则说明程序已经可以停止
	{
		condition = 0;
		for (i = 0; i < n; i++)//一次历遍
			if (str[i] == '(')  //当找到左括号
				for (j = i + 1; j < n; j++) //从它开始往后寻找右括号
					if (str[j] == ')')
					{
						for (flag = 0, k = i + 1; k < j; k++) //找到之后,检测中间是否有其他括号
						{
							if (str[k] == '(' || str[k] == ')' || str[k] == '{' ||
								str[k] == '}' || str[k] == '[' || str[k] == ']')
							{
								flag = 1;
								break;
							}
						}
						if (flag == 0)  //如果没有,将这一部分都赋为‘0’
						{
							for (k = i; k <= j; k++)
								str[k] = '0';
							condition = 1;
							break; //这个break是必须的,否则再之后的右括号都将判断成功
						}
						else   //出现了,也不用往后找,可以放弃此左括号,i++
							break;
					}
		for (i = 0; i < n; i++)
			if (str[i] == '{')   //考虑到括号的种类,需要相似的三段代码
				for (j = i + 1; j < n; j++)
					if (str[j] == '}')
					{
						for (flag = 0, k = i + 1; k < j; k++)
						{
							if (str[k] == '(' || str[k] == ')' || str[k] == '{' ||
								str[k] == '}' || str[k] == '[' || str[k] == ']')
							{
								flag = 1;
								break;
							}
						}
						if (flag == 0)
						{
							for (k = i; k <= j; k++)
								str[k] = '0';
							condition = 1;
							break;
						}
						else
							break;
					}
		for (i = 0; i < n; i++)
			if (str[i] == '[')
				for (j = i + 1; j < n; j++)
					if (str[j] == ']')
					{
						for (flag = 0, k = i + 1; k < j; k++)
						{
							if (str[k] == '(' || str[k] == ')' || str[k] == '{' ||
								str[k] == '}' || str[k] == '[' || str[k] == ']')
							{
								flag = 1;
								break;
							}
						}
						if (flag == 0)
						{
							for (k = i; k <= j; k++)
								str[k] = '0';
							condition = 1;
							break;
						}
						else
							break;
					}
	} while (condition == 1);
	for (i = 0, flag = 0; i < n; i++)
		if (str[i] == '(' || str[i] == ')' || str[i] == '{' ||
			str[i] == '}' || str[i] == '[' || str[i] == ']')
		{
			flag = 1;   //最后检测是否还有残余的括号
			break;
		}
	if (flag == 0)
		return 1;
	else
		return 0;
}
int main()
{
	char arr[100];
	gets(arr);
	printf("result:%d", isValid(arr));
	return 0;
}

实例:

(12(3(4{67}【8】)))
result:1

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值