符号匹配

符号匹配是一种常见的算法问题,主要用于检查给定的字符串中
各种符号(如括号()、方括号[]、花括号{}等)是否正确配对和嵌套。
在一个合法的符号序列中,每个左符号(如(、[、{)都必须有一个对应
的右符号(如)、]、}),并且符号的嵌套顺序必须正确。
例如,{[()]} 是一个合法的符号序列,而 {[(])} 则不是,
因为 [ 和 ] 的嵌套顺序被打乱了。

实现思路
通常使用栈(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 }
符号匹配

 

posted @ 2025-02-28 21:11  TP_003  阅读(15)  评论(0)    收藏  举报