您的位置:首页 > 编程语言 > C语言/C++

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

2018-04-08 22:26 92 查看
题目

题目链接: 点击打开链接输入:
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:第一次写博客 表达方面有些生疏 请各位大佬萌新小白见谅哈~)


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: