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

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';
}

修正说明

  1. priority函数:补全运算符判断的完整条件,添加默认返回值0,确保优先级判断逻辑正确。
  2. 运算符处理逻辑:将push(*i)和i++移到循环体外,循环仅负责弹出符合优先级条件的栈顶元素,之后再处理当前运算符。
  3. 换行符处理:读取输入后替换末尾换行符为\0,避免触发非法字符判断。
  4. push函数:修改返回类型为void,消除未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 12:35:41