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

	实现思路
	通常使用栈(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;
}

  

posted on 2025-02-26 22:43  FYJUN2077  阅读(45)  评论(0)    收藏  举报