符号匹配是一种常见的算法问题,主要用于检查给定的字符串中
各种符号(如括号()、方括号[]、花括号{}等)是否正确配对和嵌套。
在一个合法的符号序列中,每个左符号(如(、[、{)都必须有一个对应
的右符号(如)、]、}),并且符号的嵌套顺序必须正确。
例如,{[()]} 是一个合法的符号序列,而 {[(])} 则不是,
因为 [ 和 ] 的嵌套顺序被打乱了。
实现思路
通常使用栈(Stack)这种数据结构来解决符号匹配问题。具体步骤如下:
遍历输入的字符串。
当遇到左符号时,将其压入栈中。
当遇到右符号时,检查栈顶元素是否为对应的左符号。如果是,则将栈顶元素弹出;如果不是或者栈为空,则说明符号不匹配。
遍历结束后,如果栈为空,则说明所有符号都匹配;否则,说明有左符号没有对应的右符号。

1 #include <iostream> 2 #include <stack> 3 #include <string> 4 using namespace std; 5 6 // 函数用于检查符号是否匹配 7 bool isMatchingPair(char opening, char closing) { 8 if (opening == '(' && closing == ')') return true; 9 if (opening == '[' && closing == ']') return true; 10 if (opening == '{' && closing == '}') return true; 11 return false; 12 } 13 14 // 函数用于检查字符串中的符号是否匹配 15 bool isBalanced(const string& expression) { 16 stack<char> s; 17 for (char ch : expression) { 18 if (ch == '(' || ch == '[' || ch == '{') { 19 // 如果是左符号,将其压入栈中 20 s.push(ch); 21 } else if (ch == ')' || ch == ']' || ch == '}') { 22 if (s.empty()) { 23 // 如果栈为空,说明没有对应的左符号 24 return false; 25 } else { 26 char top = s.top(); 27 s.pop(); 28 if (!isMatchingPair(top, ch)) { 29 // 如果栈顶元素与当前右符号不匹配 30 return false; 31 } 32 } 33 } 34 } 35 // 遍历结束后,如果栈为空,则说明所有符号都匹配 36 return s.empty(); 37 } 38 39 int main() { 40 string expression = "{[()]}"; 41 if (isBalanced(expression)) { 42 cout << "符号匹配" << endl; 43 } else { 44 cout << "符号不匹配" << endl; 45 } 46 return 0; 47 }