对源代码的语法检查是代码编译中的一个基础步骤,在语法分析阶段编译器会检查语法是否符合语言的规则。而在这个过程中对表达式括号匹配是一个必须的环节,例如“[()]"是合法的,"[(])"是非法的,对于括号的匹配问题通常有两种做法,一种是递归求解,另一种是通过栈结构迭代实现。下面主要讲解利用栈的实现。
使用栈的主要实现算法为:
做一个空栈。读入字符直到文件尾。如果字符是一个开放符号,则将其推入栈中,如果字符是一个封闭符号,则当栈空时报错。否则将栈元素弹出,如果弹出的符号不是对应的开放符号,则报错。在文件尾,如果栈非空则报错。
下面是代码实例:
#include <iostream> #include <stack> #include <iomanip> using namespace std; bool validToken(char *token) { char *p = token; stack<char> stk; while (*p) { switch (*p) { case ‘(‘: case ‘[‘: case ‘{‘: stk.push(*p); break; case ‘)‘: { if (stk.empty() || stk.top() != ‘(‘) return false; stk.pop(); break; } case ‘]‘: { if (stk.empty() || stk.top() != ‘[‘) return false; stk.pop(); break; } case ‘}‘: { if (stk.empty() || stk.top() != ‘{‘) return false; stk.pop(); break; } default: break; } p++; } return stk.empty(); } int main() { cout << boolalpha << validToken("{{[[]}") << endl; cout << boolalpha << validToken("{} {{{}}}") << endl; cout << boolalpha << validToken("()(({{[]}}))") << endl; cout << boolalpha << validToken("((([]])))") << endl; return 0; }
时间: 2024-12-12 02:59:09