括号匹配问题

来源:互联网 发布: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;}
运行结果如下:



原创粉丝点击