/*
符号匹配是一种常见的算法问题,主要用于检查给定的字符串中
各种符号(如括号()、方括号[]、花括号{}等)是否正确配对和嵌套。
在一个合法的符号序列中,每个左符号(如(、[、{)都必须有一个对应
的右符号(如)、]、}),并且符号的嵌套顺序必须正确。
例如,{[()]} 是一个合法的符号序列,而 {[(])} 则不是,
因为 [ 和 ] 的嵌套顺序被打乱了。
实现思路
通常使用栈(Stack)这种数据结构来解决符号匹配问题。具体步骤如下:
遍历输入的字符串。
当遇到左符号时,将其压入栈中。
当遇到右符号时,检查栈顶元素是否为对应的左符号。如果是,则将栈顶元素弹出;如果不是或者栈为空,则说明符号不匹配。
遍历结束后,如果栈为空,则说明所有符号都匹配;否则,说明有左符号没有对应的右符号。
*/
#include <iostream>
#include <stack>
#include <string>
using namespace std;
// 函数用于检查符号是否匹配
bool isMatchingPair(char opening, char closing) {
if (opening == '(' && closing == ')') return true;
if (opening == '[' && closing == ']') return true;
if (opening == '{' && closing == '}') return true;
return false;
}
// 函数用于检查字符串中的符号是否匹配
bool isBalanced(const string& expression) {
stack<char> s;
for (char ch : expression) {
if (ch == '(' || ch == '[' || ch == '{') {
// 如果是左符号,将其压入栈中
s.push(ch);
} else if (ch == ')' || ch == ']' || ch == '}') {
if (s.empty()) {
// 如果栈为空,说明没有对应的左符号
return false;
} else {
char top = s.top();
s.pop();
if (!isMatchingPair(top, ch)) {
// 如果栈顶元素与当前右符号不匹配
return false;
}
}
}
}
// 遍历结束后,如果栈为空,则说明所有符号都匹配
return s.empty();
}
int main() {
string expression = "{[()]}";
if (isBalanced(expression)) {
cout << "符号匹配" << endl;
} else {
cout << "符号不匹配" << endl;
}
return 0;
}