C语言栈实现中缀转后缀无输出问题求助
中缀转后缀表达式无输出问题排查与修复
核心错误点
priority函数逻辑错误:原代码中x == '*' || '/'的写法等价于(x == '*') || '/',而'/'是非0值,导致所有字符都会匹配该分支返回2,完全破坏优先级判断;同时函数缺少默认返回值,非运算符传入时会返回随机值。- 运算符处理循环逻辑混乱:处理运算符的while循环中,
push(*i)和i++被放在循环体内,导致每次循环都重复执行这两个操作,陷入逻辑错误(比如重复push同一运算符、提前移动指针)。 - 未处理
fgets读取的换行符:fgets会把输入末尾的换行符\n存入数组,该字符会触发非法字符判断分支,直接终止程序,导致无输出。 push函数返回值异常:函数声明返回char但无return语句,引发未定义行为。
修正后的代码
#include<string.h> #include<stdlib.h> #include<stdio.h> #include<ctype.h> #define max 100 char stack[max]; int top = -1; char pop(); void push(char x); // 修改返回值为void,无需返回值 int priority(char x); void infixtopostfix(char *infix, char *postfix); int main() { char infix[100], postfix[100]; printf("Enter the expression: "); fgets(infix, max, stdin); // 去除fgets读取的换行符 size_t len = strlen(infix); if (len > 0 && infix[len-1] == '\n') { infix[len-1] = '\0'; } infixtopostfix(infix, postfix); puts(postfix); } char pop() { char val; if (top == -1) { printf("underflow\n"); exit(1); } else { val = stack[top--]; return val; } } void push(char x) { // 改为void返回类型,消除未定义行为 if (top == max - 1) { printf("overflow\n"); exit(1); } else { stack[++top] = x; } } int priority(char x) { if (x == '^') return 3; if (x == '*' || x == '/') // 修正条件判断逻辑 return 2; if (x == '+' || x == '-') // 修正条件判断逻辑 return 1; return 0; // 添加默认返回值,处理非运算符情况 } void infixtopostfix(char *infix, char *postfix) { char *p, *i; i = infix; p = postfix; while (*i != '\0') { if (isalpha(*i) || isdigit(*i)) { *p = *i; p++; i++; } else if (*i == '(') { push(*i); i++; } else if (*i == ')') { while ((top != -1) && (stack[top] != '(')) { *p = pop(); p++; } if (top == -1) { printf("invalid statement\n"); exit(1); } pop(); // 弹出左括号,不加入后缀表达式 i++; } else if (*i == '+' || *i == '*' || *i == '/' || *i == '-' || *i == '^') { // 修正循环逻辑:先弹出所有优先级>=当前运算符的栈顶元素(非左括号) while ((top != -1) && stack[top] != '(' && priority(*i) <= priority(stack[top])) { *p = pop(); p++; } push(*i); i++; } else { printf("invalid expression\n"); exit(1); } } // 弹出栈中剩余的运算符 while ((top != -1) && (stack[top] != '(')) { *p = pop(); p++; } *p = '\0'; }
修正说明
priority函数:补全运算符判断的完整条件,添加默认返回值0,确保优先级判断逻辑正确。- 运算符处理逻辑:将
push(*i)和i++移到循环体外,循环仅负责弹出符合优先级条件的栈顶元素,之后再处理当前运算符。 - 换行符处理:读取输入后替换末尾换行符为
\0,避免触发非法字符判断。 push函数:修改返回类型为void,消除未定义行为。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

