你可以在 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助手提供,问题来源于学员提问


 
                             
         
        
 
         
         
         
         
         
         
         
        
 
                 
                 
                 
                 
                 
                 
                 
                