判断字符串中数学表达式的结果是否正确,可以通过以下步骤进行:
以下是一个示例代码(使用JavaScript):
function isMathExpressionValid(expression) {
// Step 1: 检查表达式中是否只包含合法字符
// 正则表达式匹配非法字符
const illegalChars = /[^0-9+\-*/()\s]/;
if (illegalChars.test(expression)) {
return false;
}
// Step 2: 检查括号匹配
const stack = [];
for (let i = 0; i < expression.length; i++) {
if (expression[i] === '(') {
stack.push('(');
} else if (expression[i] === ')') {
if (stack.length === 0) {
return false; // 右括号多于左括号
}
stack.pop();
}
}
if (stack.length !== 0) {
return false; // 左括号多于右括号
}
// Step 3: 将中缀表达式转换为后缀表达式
const operators = {
'+': 1,
'-': 1,
'*': 2,
'/': 2,
};
const outputQueue = [];
const operatorStack = [];
const tokens = expression.split(/\s+/); // 按空格分割表达式
for (let i = 0; i < tokens.length; i++) {
const token = tokens[i];
if (!isNaN(token)) {
outputQueue.push(token); // 数字直接输出
} else if (token in operators) {
while (
operatorStack.length > 0 &&
operators[token] <= operators[operatorStack[operatorStack.length - 1]]
) {
outputQueue.push(operatorStack.pop());
}
operatorStack.push(token);
} else if (token === '(') {
operatorStack.push(token);
} else if (token === ')') {
while (operatorStack.length > 0 && operatorStack[operatorStack.length - 1] !== '(') {
outputQueue.push(operatorStack.pop());
}
operatorStack.pop(); // 弹出左括号
}
}
while (operatorStack.length > 0) {
outputQueue.push(operatorStack.pop());
}
// Step 4: 计算后缀表达式
const stack = [];
for (let i = 0; i < outputQueue.length; i++) {
const token = outputQueue[i];
if (!isNaN(token)) {
stack.push(parseFloat(token));
} else if (token in operators) {
const b = stack.pop();
const a = stack.pop();
let result;
switch (token) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
if (b === 0) {
return false; // 除零错误
}
result = a / b;
break;
}
stack.push(result);
}
}
if (stack.length !== 1) {
return false; // 表达式错误
}
// Step 5: 返回结果
return true;
}
// 示例用法
const expression = '3 + 4 * (2 - 1)';
const isValid = isMathExpressionValid(expression);
console.log(isValid); // 输出: true
请注意,以上代码仅为示例,可能无法处理复杂的数学表达式,如函数、变量等。在实际应用中,可能需要使用更复杂的算法和数据结构来处理更复杂的数学表达式。
领取专属 10元无门槛券
手把手带您无忧上云