括号匹配问题
来源:互联网 发布:cn域名 国外空间 编辑:程序博客网 时间:2024/06/11 16:59
1、右括号比左括号多 eg:(()))[b]{c}
2、左括号比右括号多 eg:(()[b]{c}
3、括号不匹配 eg:()([)){abc}
4、括号匹配成功 eg:(()){c}[ab]
根据栈“后进先出”的特性,我们可以对括号匹配问题这样处理:
将所遇到的左括号入栈,如果碰到右括号,则与栈顶的元素比较。
如果碰到一个右括号且此时的栈为空,则表明右括号比左括号多。
如果碰到一个右括号,但此时与栈顶不相同,则括号不匹配。
字符全部遍历之后,如果栈不为空,则左括号多
如果栈为空,则括号匹配成功。
我们来看一下代码:
//括号匹配#include<iostream>#include<stack>using namespace std;//判断是否为括号bool IsBrackets(char c){if (c == '(' || c == ')' || c == '{' || c == '}' || c == '[' || c == ']'){return true;}return false;}bool MatchBrackets(char *str){stack<char> s;size_t len = strlen(str);for (size_t i = 0; i < len; i++){if (!IsBrackets(str[i]))continue;else{//左括号压栈if (str[i] == '(' || str[i] == '{' || str[i] == '[')s.push(str[i]);//右括号else if (str[i] == ')' || str[i] == '}' || str[i] == ']'){if (s.empty()){cout << "右括号比左括号多" << endl;return false;}else{if ((str[i] == ')' && s.top() == '(') || (str[i] == '}' && s.top() == '{')|| (str[i] == ']' && s.top() == '[')){s.pop();}else{cout << "括号不匹配" << endl;return false;}}}}}if (s.empty()){cout << "括号匹配" << endl;return true;}else{cout << "左括号比右括号多" << endl;return false;}}int main(){char *str1 = "(()))[b]{c}"; //右比左多char *str2 = "(()[b]{c}"; //左比右多char *str3 = "()([)){abc}"; //不匹配char *str4 = "(()){c}[ab]"; //匹配char *str5 = "))(("; //不匹配MatchBrackets(str1);MatchBrackets(str2);MatchBrackets(str3);MatchBrackets(str4);MatchBrackets(str5);system("pause");return 0;}
运行结果如下:
我们可以看到第五种属于特殊情况,若首先出现右括号,比如说:"))((";这应该属于括号不匹配,可测试结果为右括号比左括号多。因此我们还需对程序做以改进。具体操作如下:
我们可以再添加一个栈,用来保存未能匹配的所有右括号。
在遍历结束之后,将之前的栈和此时添加的栈来进行比较,确定括号匹配问题。
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<stack>using namespace std;//判断是否为括号bool IsBrackets(char c){if (c == '(' || c == ')' || c == '{' || c == '}' || c == '[' || c == ']'){return true;}return false;}bool MatchBrackets(char *str){stack<char> s;stack<char> right;size_t len = strlen(str);for (size_t i = 0; i < len; i++){if (!IsBrackets(str[i]))continue;else{//左括号压栈if (str[i] == '(' || str[i] == '{' || str[i] == '[')s.push(str[i]);//右括号else if (str[i] == ')' || str[i] == '}' || str[i] == ']'){if (s.empty()){//未匹配的右括号入栈right.push(str[i]);//cout << "右括号比左括号多" << endl;//return false;}else{if ((str[i] == ')' && s.top() == '(') || (str[i] == '}' && s.top() == '{')|| (str[i] == ']' && s.top() == '[')){s.pop();}else{//未匹配的右括号入栈right.push(str[i]);//cout << "括号不匹配" << endl;//return false;}}}}}if (right.empty() && s.empty()){cout << "括号匹配" << endl;return true;}else if (right.empty() && !s.empty()){cout << "左括号比右括号多" << endl;return false;}else if (!right.empty() && s.empty()){cout << "右括号比左括号多" << endl;return false;}else if (!right.empty() && !s.empty()){cout << "不匹配" << endl;return false;}}int main(){char *str1 = "(()))[b]{c}"; //右比左多char *str2 = "(()[b]{c}"; //左比右多char *str3 = "()([)){abc}"; //不匹配char *str4 = "(()){c}[ab]"; //匹配char *str5 = "))(("; //不匹配MatchBrackets(str1);MatchBrackets(str2);MatchBrackets(str3);MatchBrackets(str4);MatchBrackets(str5);system("pause");return 0;}运行结果如下:
阅读全文
0 0
- 括号匹配问题
- 括号匹配问题
- 括号匹配问题
- 括号匹配问题
- 括号匹配问题
- 括号匹配问题
- 括号匹配问题
- 括号的匹配问题
- 括号匹配问题
- 括号匹配问题
- [栈] 括号匹配问题
- NY : 括号匹配问题
- 括号匹配问题
- Java 括号匹配问题
- 括号匹配问题
- 括号匹配问题
- 括号匹配问题
- 括号匹配问题
- python正则总结
- Codeforce 890A ACM ICPC(枚举)
- JS学习(七)
- HDU N皇后问题 2553 【深搜练习】
- An internal error occurred during: "Loading descriptor for xxx.".
- 括号匹配问题
- day16笔记
- 面向对象
- 数据防泄密(DLP)系统
- 如果出现run-init:/sbin/init:No such file or directory
- JavaScript基础
- 水仙花数
- CTF writeup之pwn2own warehouse
- 算法 动态规划