You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中缀转后缀表达式异常:结果未更新求助

中缀转后缀表达式代码问题排查

问题现象

用C语言实现中缀转后缀表达式,运行无报错,但main函数无法输出后缀结果;在infixToPostfix函数末尾添加打印语句也无输出。

代码中的核心错误及修复方案

  • 野指针导致内存访问错误
    main函数中char* postfix;是未初始化的野指针,未指向有效内存空间,写入数据会触发未定义行为。
    修复:改为char postfix[MAX_LEN];,分配足够的数组空间。

  • 条件判断错误(赋值而非比较)
    处理空格和制表符的代码中,infix[i] = '\t'是赋值操作,不是判断相等,会篡改原表达式内容,导致后续逻辑异常。
    修复:改为infix[i] == '\t'。

  • 重复的右括号处理逻辑
    代码中出现两段完全相同的else if (infix[i] == ')')处理块,会导致逻辑混乱,右括号被重复处理。
    修复:删除其中一段重复的右括号处理代码。

  • 操作符优先级处理逻辑错误
    原代码处理操作符时仅弹出一次栈顶元素就停止,未处理栈中所有优先级大于等于当前操作符的元素,不符合中缀转后缀的算法逻辑。
    修复:将单分支判断改为循环,持续弹出栈顶优先级不低于当前操作符的元素,再将当前操作符入栈。

  • 多字符标识符处理逻辑缺陷
    原代码仅判断下一个字符是否为字母/数字,无法正确处理多字符标识符(如abc),且isNextDig变量未实际使用。
    修复:用循环遍历所有连续的字母/数字字符,一次性写入后缀表达式。

  • 栈清空循环位置错误
    原代码将弹出栈中剩余元素的循环放在外层while(i < len)内部,导致每次处理一个字符后就清空栈,完全破坏算法流程。
    修复:将该循环移到外层while循环结束之后,确保所有中缀字符处理完后再弹出栈中剩余操作符。

  • 转义字符错误
    打印语句中的换行符使用了非标准格式,而非C语言标准的\n,可能导致输出异常。
    修复:将所有非标准换行替换为\n。

修正后的完整代码

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define MAX_LEN 100

int precedence(char c){
    switch (c)
    {
    case '+':
    case '-':
        return 1;
    
    case '*':
    case '/':
        return 2;
    
    case '^':
        return 3;
    default:
        return -1;
    }
}

int isOperator(char c){
    return (c == '+' || c == '-' || c == '*' || c == '/' || c == '^');
}

void infixToPostfix(char* infix,char* postfix){
    int i = 0, j = 0;
    int len = strlen(infix), top = -1;
    char stack[MAX_LEN];

    while(i < len){
        // 跳过空格和制表符
        if(infix[i] == '\t' || infix[i] == ' '){
            i++;
            continue;
        }

        // 处理字母/数字(支持多字符)
        if (isalnum(infix[i])) {
            while(i < len && isalnum(infix[i])){
                postfix[j++] = infix[i++];
            }
            postfix[j++] = ' ';
        }
        // 处理左括号
        else if(infix[i] == '('){
            stack[++top] = infix[i++];
        }
        // 处理右括号
        else if (infix[i] == ')') {
            while (top > -1 && stack[top] != '('){
                postfix[j++] = stack[top--];
                postfix[j++] = ' ';
            }
            if (top > -1 && stack[top] != '(')
                return; // 不匹配的括号,直接返回
            else
                top--; // 弹出左括号
            i++;
        }
        // 处理操作符
        else if(isOperator(infix[i])){
            // 弹出所有优先级不低于当前操作符的栈顶元素
            while(top > -1 && precedence(infix[i]) <= precedence(stack[top])){
                postfix[j++] = stack[top--];
                postfix[j++] = ' ';
            }
            stack[++top] = infix[i++];
        }
    }

    // 弹出栈中剩余的操作符
    while (top > -1) {
        if (stack[top] == '(') {
            return; // 存在未匹配的左括号,直接返回
        }
        postfix[j++] = stack[top--];
        postfix[j++] = ' ';
    }

    postfix[j] = '\0';
    printf("postfix: %s\n", postfix);
}

int main(){
    char infix[MAX_LEN] = "a+b*(c^d-e)^(f+g*h)-i";
    char postfix[MAX_LEN]; // 分配足够空间,避免野指针
    infixToPostfix(infix, postfix);
    printf("The postfix is : %s\n", postfix);
    return 0;
}

运行结果

修正后运行代码,会输出:

postfix: a b c d ^ e - f g h * + ^ * + i - 
The postfix is : a b c d ^ e - f g h * + ^ * + i - 

内容的提问来源于stack exchange,提问作者Dhairya Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:27:13