NYOJ 括号匹配问题 c++解决办法之一

本文介绍了一种基于二维数组和特定逻辑判断的括号匹配算法实现。通过输入不同类型的括号序列,该算法能够判断括号是否正确配对,并详细解释了其实现逻辑和运行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

题目链接: 点击打开链接
输入:
3
[()]
[())(]
()[()]

输出:
Yes
No
Yes

Code
# include<iostream>
# include<string>
using namespace std;
void main()
{
	int a = 0;  
	int c[5] = { 0 };    //用于记录每个数据组的实际占用大小
	char b[5][10000] = { 0 };  //使用二维数组记录小于5组的数据
	int ch[1000] = { 0 };  //下面有详细的解释
	int m = 0;     //用来标记ch[]数组的下标
	ch[0] = 0;
	//*************************************************************************
	while (a <= 5)
	{
		cin >> a;
		if (a > 5)
		{
			cout << "取值不能大于5" << endl;
		}
		else{
			break;
		}
	}
	//  这一部分是用来判定用户输入的值 若大于5组就不符合题意了(题目上说数据组不能超过5组,但是又说N取值能取0~100 我不太明白什么意思,就按照不能超过5组写吧)
	//**************************************************************************
	cout << "请任意输入[,],(,)四种字符,~切换下一行" << endl;
	for (int j = 0; j < a; ++j)
	{
		for (int i = 0; i < 10000; ++i)
		{
			cin >> b[j][i];
			if (b[j][i] == '~')
			{
				c[j] = i - 1;
				cout << "已输入" << j + 1 << "组数据,总共需要输入" << a << "组数据" << endl;
				break;
			}
		}
	}
	//       使用b[][]二维数组记录a组数据 每一组数据用~符号结束
	//********************************************************************************
	for (int j = 0; j < a; ++j)
	{
		for (int i = 0; i <= c[j]; ++i)
		{
			cout << b[j][i] << "	";
		}
		cout << endl;
	}
	for (int j = 0; j < a; ++j)
	{
		m = 1;                                 //ch[]数组由1开始存值,每一组数据都要初始化m的值为1
		for (int i = 0; i <= c[j]; ++i)
		{
			ch[m] = b[j][i];
			if (ch[m - 1] == '(' && ch[m] == ')')
			{
				m = m - 2;
			}
			else if (ch[m - 1] == '[' && ch[m] == ']')
			{
				m = m - 2;
			}
			else if (ch[m] == ']' || ch[m] == ')')
			{
				cout << "No" << endl;
				++m;
				break;
			}
			++m;
		}
		if (m == 1)
		{
			cout << "Yes" << endl;
		}
	}
//		第一次大循环,第一次小循环 j=0 i=0 让ch[1]存入b[0][0]的值;因为ch[0]=0不可能满足任一个条件
//							   第二次小循环 j = 0 i = 1 让ch[2]存入b[0][1]的值; 若ch[1]和ch[2]满足第1, 2条件即'[]'或'()'消掉ch[1], ch[2]即让m = m - 2 = 0进行下一次循环
//		                                                                                             若满足第3个条件即')', ']', '(]', "[)"时,这时的括号组不管后面是什么肯定不会匹配的,所以输出No ,结束小循环
//		                                                                                             若不满足三个条件即'[[''(('这种情况时,进行第三次循环
//                            第三次小循环 j = 0 i = 1 让ch[3]存入b[0][2]的值; 若ch[2]和ch[3]满足第1, 2条件即'[]'或'()'消掉ch[2], ch[3]即让m = m - 2 = 1进行下一次循环
//		                                                                                             若满足第3个条件即')', ']', '(]', "[)"时,这时的括号组不管后面是什么肯定不会匹配的,所以输出No,结束小循环
//		                                                                                             若不满足三个条件即'[[''(('这种情况时,进行第四次循环
//                            第若干次小循环 j=0 i=n  重复第二,三次小循环的步骤 直到 b[1][i],i=c[j]时(c[]数组记录着每个数据组的实际大小)结束小循环如果此时m=1
//                                                                                                         	  (因为ch[]数组是从m=1开始存值的,若结束循环后m还等于1说明这个数组存的括号都被抵消掉了)
//                                                                                                            说明这一组括号匹配 输出Yes 进行第二次大循环
//    第二次大循环,重复第一次小循环的步骤  ....
//    第若干次大循环 重复前两次大循环的步骤 直到程序结束 即可得出所有用户输入的每一个括号组是否匹配
	//***************************************************************************************
	system("pause");
}



运行结果如下:

这是我对这道题的一种理解方法,或许比较麻烦,但是自我感觉理解起来会容易一些
(ps:第一次写博客 表达方面有些生疏 请各位大佬萌新小白见谅哈~)


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值