3.请实现一个算法,判断数学表达式是否合法,例如: 合法:“123 * ((456 - 3) + 789)”, 非法:“123(* 456 + 789)”。 bool is_math_expression (char* exp)
时间: 2024-03-18 16:38:36 浏览: 108
好的,我可以提供以下算法实现,用于判断数学表达式是否合法:
```c++
#include <stack>
#include <unordered_map>
#include <cstring>
bool is_math_expression(char* exp) {
// 操作符和优先级
std::unordered_map<char, int> op_map = {
{'+', 1},
{'-', 1},
{'*', 2},
{'/', 2},
{'(', 0},
{')', 0}
};
// 操作数栈和操作符栈
std::stack<char> num_stack;
std::stack<char> op_stack;
// 遍历表达式,逐个处理字符
for (int i = 0; i < strlen(exp); i++) {
char c = exp[i];
// 如果字符是数字或小数点,则将其加入到操作数栈中
if (isdigit(c) || c == '.') {
num_stack.push(c);
}
// 如果字符是操作符,则将其加入到操作符栈中
else if (op_map.count(c) != 0) {
// 如果操作符栈为空或者栈顶操作符的优先级小于当前操作符,则将当前操作符加入到操作符栈中
if (op_stack.empty() || op_map[op_stack.top()] < op_map[c]) {
op_stack.push(c);
}
// 否则,将操作符栈中的操作符依次弹出,并将其加入到操作数栈中
else {
while (!op_stack.empty() && op_map[op_stack.top()] >= op_map[c]) {
num_stack.push(op_stack.top());
op_stack.pop();
}
op_stack.push(c);
}
}
// 如果字符是空格,则忽略该字符
else if (c == ' ') {
continue;
}
// 如果字符是其他非法字符,则返回false
else {
return false;
}
}
// 将操作符栈中剩余的操作符加入到操作数栈中
while (!op_stack.empty()) {
num_stack.push(op_stack.top());
op_stack.pop();
}
// 经过上述处理后,操作数栈中应该只有一个元素,否则表达式非法
return num_stack.size() == 1;
}
```
该算法使用了操作数栈和操作符栈,通过遍历表达式中的字符,逐个处理,如果是数字或小数点,则将其加入到操作数栈中;如果是操作符,则将其加入到操作符栈中;如果是空格,则忽略该字符;如果是其他非法字符,则返回false。在处理完所有字符后,将操作符栈中剩余的操作符加入到操作数栈中,最后判断操作数栈中是否只有一个元素,如果是,则表达式合法,否则表达式非法。
阅读全文