NYOJ 括号匹配问题 c++解决办法之一
2018-04-08 22:26
92 查看
题目
题目链接: 点击打开链接输入:
输出:
运行结果如下:
这是我对这道题的一种理解方法,或许比较麻烦,但是自我感觉理解起来会容易一些(ps:第一次写博客 表达方面有些生疏 请各位大佬萌新小白见谅哈~)
题目链接: 点击打开链接输入:
3 [()] [())(] ()[()]
输出:
Yes No YesCode
# 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:第一次写博客 表达方面有些生疏 请各位大佬萌新小白见谅哈~)
相关文章推荐
- [C++]连续最长括号匹配问题解决策略二(学习)
- 用C++链式栈解决数据结构中的括号匹配问题。
- [C++]连续最长括号匹配问题解决策略二(学习)
- 数据结构(18)栈典型问题之C++实现括号匹配
- Android 编译出错版本匹配问题解决办法
- c++对象成员函数返回自身引用时出现的诡异问题及解决办法
- iphone4 美版电信烧号6.1.3电话号码括号问题解决办法
- Windows C++程序调用包含TensorFlow代码的Python脚本出错问题的解决办法
- NYOJ15 - UVA1626 括号匹配问题(区间dp)
- NYOJ.2.括号匹配问题
- java堆栈类解决括号匹配问题
- 用VS2010编写的C++程序,在其他电脑上无法运行,提示缺少mfc100.dll的解决办法 vc链接静态库的时候要注意的问题
- 使用vim编写c++对于输入输出流<<和<>括号匹配冲突的解决方法
- NYOJ2括号匹配问题
- Microsoft Visual C++ 2005 Redistributable 无法卸载问题解决办法
- c/c++ MAP遇到的两个问题及解决办法
- NYOJ---括号匹配问题---栈的使用
- Android Studio 左右括号无法 自动匹配解决办法
- Microsoft visual c++ 14.0 is required问题解决办法
- NYOJ-括号配对问题--------待解决,RE