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

