你可以在 evaluate 函数中添加判断优先级的功能。可以使用一个优先级比较函数来比较两个运算符的优先级,然后根据优先级来决定是否需要弹出栈中的运算符进行计算。
下面是修改后的代码示例:
int priority(char operator) {
if (operator == '*' || operator == '/')
return 2;
else if (operator == '+' || operator == '-')
return 1;
else
return 0; // 括号或其他非法字符
}
// ...
void evaluateExpression(Stack *operandStack, Stack *operatorStack) {
char op = pop(operatorStack);
int b = pop(operandStack);
int a = pop(operandStack);
int result = calculate(a, op, b);
push(operandStack, result);
}
int evaluate(char *expression) {
Stack operandStack; // 操作数栈
Stack operatorStack; // 运算符栈
initStack(&operandStack);
initStack(&operatorStack);
int i = 0;
while (expression[i] != '\0') {
// ...
} else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/') { // 处理运算符
while (!isEmpty(&operatorStack) && peek(&operatorStack) != '(' && priority(expression[i]) <= priority(peek(&operatorStack))) {
evaluateExpression(&operandStack, &operatorStack);
}
push(&operatorStack, expression[i]);
i++;
// ...
} else if (expression[i] == ')') { // 处理右括号
while (!isEmpty(&operatorStack) && peek(&operatorStack) != '(') {
evaluateExpression(&operandStack, &operatorStack);
}
// ...
}
// ...
}
// ...
}
这样,程序将会根据运算符的优先级来进行计算。注意,优先级函数 priority 返回一个整数值,其中大于等于2的值表示乘法和除法的优先级较高,返回1表示加法和减法的优先级较低,返回0表示非法字符或括号。
内容由零声教学AI助手提供,问题来源于学员提问