简单栈的应用之括号匹配
2017-12-13 21:19
393 查看
常常我们在写程序时,编译代码能发现我们括号匹配正确与否,今天我们模拟实现一个简单的括号匹配函数,用以复习栈的引用
#include<iostream> #include<stack> using namespace std; bool is_Brackets(char ch) { if (ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == '{' || ch == '}') return true; else return false; } bool is_left_Brackets(char ch) { if (ch == '(' || ch == '[' || ch == '{') return true; else return false; } int main(void) { char str[20]; char ch; int i = 0; scanf("%s",&str); //cin >> str; stack<char> sta; while (str[i]) { if (!is_Brackets(str[i])) { ; } else { if (is_left_Brackets(str[i])) { sta.push(str[i]); } else { if (sta.empty()) { printf("左括号缺少!!!"); return 0; } ch=sta.top(); switch (str[i]) { case ')': if (ch == '(') { sta.pop(); break; } else { printf("括号不匹配!!!"); return 0; } case ']': if (ch == '[') { sta.pop(); break; } else { printf("括号不匹配!!!"); return 0; } case '}': if (ch == '{') { sta.pop(); break; } else { printf("括号不匹配!!!"); return 0; } } } } i++; } if (sta.empty()) printf("括号匹配!!!"); else printf("右括号缺少!!!"); return 0; }
上面实现的有点水,下面实现一个优化过的版本(有百度过)
#include <iostream> //#include <cmath> #include <stack> using namespace std; bool judge(const char *); char getType(const char); bool match(const char, const char); int main() { cout << "输入待测序列:" << endl; char seq[20]; cin >> seq; //读取一个序列 cout << (judge(seq) ? "成功" : "失败") << endl; //判断并输出结果 return 0; } //判断字符类型 左括号,右括号 或 其他 char getType(const char c) { char bracketSet[] = "([{}])"; int i; for (i = 0; i < 6; i++) { if (bracketSet[i] == c) break; } if (i<3) return 'l'; else if (i < 6) return 'r'; else return 'n'; } //判断是否为一对匹配的括号 bool match(const char cL, const char cR) { if (cL == '(') return cR == ')' ? true : false; else return cR == cL + 2 ? true : false; } //判断序列是否括号匹配 bool judge(const char * str) { stack<char> S; //新建一个栈 int i; char bracketType; for (i = 0; str[i] != '\0'; i++) { bracketType = getType(str[i]); //判断是否为括号 if (bracketType == 'l') { S.push(str[i]); //遇到左括号,入栈 } else if (bracketType == 'r') { //遇到左括号,与栈顶比较,若匹配,栈释放顶层元素 if (match(S.top(), str[i])) S.pop(); //否则匹配失败,结束函数 else return false; } } //判断栈内是否还有左括号,若无,则匹配成功 if (S.empty()) return true; else return false; }
相关文章推荐
- 数据结构-C语言 栈的简单应用——括号匹配
- COJ 1065括号匹配:栈的简单应用
- 栈的简单应用(数制转换、括号匹配检验、行编辑、迷宫求解)
- leetcode 20 简单括号匹配
- 递归应用之括号匹配检验
- 堆栈小应用(一):括号匹配程序
- 数据结构栈的应用之括号匹配
- 栈的应用之括号匹配
- 数据结构——顺序栈及其应用(括号匹配)
- 一个简单的正则表达式应用,正则匹配选出XPath表达式
- 堆栈应用括号匹配实验
- c++STL的stack的应用之括号匹配
- 九度OJ 1153 括号匹配问题(栈的应用)
- 括号的匹配(简单)
- (1.2.2.1)栈和队列的应用:数制转换、括号匹配、后缀表达式求解,中缀表达式求解、双栈实现队列,min函数栈
- 第三章:顺序栈及其应用之二---括号匹配
- 简单的括号匹配问题,只有 ( 和 )。。。其实原理就是开栈最后的状态。。。
- 栈的应用之括号匹配
- 栈应用 一(括号匹配)
- 括号匹配——栈的基础应用1