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

中缀转后缀表达式无输出问题求助(限用数组与字符串)

排查中缀转后缀表达式无输出问题的常见原因

嘿,我来帮你揪揪这个没输出的问题!你说实现中缀转后缀但完全没结果,结合你给出的代码片段,我先梳理几个最可能踩的坑,毕竟你只能用数组和字符串,咱们从基础细节查起:

  • 栈操作的基础逻辑错误:你用string stack作为栈容器,初始top=-1,那push函数的实现是不是有问题?比如正确的push逻辑应该是先把top加1,再给对应位置赋值(stack[++top] = op;)。要是你搞反了顺序,或者直接用stack.push_back(op)但忘了同步更新top值,后续的栈操作全都会出错,要么写不到正确位置,要么读取栈顶时拿错内容,最终导致后缀表达式根本没被正确构建。

  • 核心转换逻辑缺失:你只贴了栈的初始化和push的开头,是不是还没写完中缀表达式的遍历逻辑?比如有没有逐个读取输入的字符,判断它是操作数、运算符还是括号?如果连遍历输入的步骤都没做,那自然不会生成任何后缀表达式内容,输出当然为空。

  • 输出环节被遗漏:就算你已经完成了转换,有没有把最终生成的后缀表达式用cout打印出来?很多时候忙活半天写转换逻辑,最后忘了把结果输出,那肯定看不到任何内容。

  • 栈的剩余运算符未弹出:转换结束后,栈里可能还剩未处理的运算符,你有没有把它们全部弹出并追加到后缀表达式里?如果这一步没做,后缀表达式可能不完整,甚至是空的(比如全是运算符的极端情况)。

给你一个简单的完整参考示例,你可以对照着检查自己的代码:

#include<iostream>
#include<string>
using namespace std;

string opStack;
int top = -1;

// 入栈操作
void push(char op) {
    // 用string的push_back更安全,避免数组越界问题
    opStack.push_back(op);
    top++;
}

// 出栈操作
char pop() {
    if (top == -1) return '\0'; // 栈空返回空字符
    char op = opStack[top];
    opStack.pop_back();
    top--;
    return op;
}

// 判断运算符优先级
int precedence(char op) {
    if (op == '+' || op == '-') return 1;
    if (op == '*' || op == '/') return 2;
    return 0; // 括号或其他字符优先级最低
}

// 中缀转后缀核心函数
string infixToPostfix(string infix) {
    string postfix;
    for (char c : infix) {
        // 操作数直接加入后缀表达式
        if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) {
            postfix += c;
        }
        // 左括号直接入栈
        else if (c == '(') {
            push(c);
        }
        // 右括号:弹出到左括号为止
        else if (c == ')') {
            while (top != -1 && opStack[top] != '(') {
                postfix += pop();
            }
            pop(); // 弹出左括号,不加入后缀
        }
        // 处理运算符:按优先级弹出栈顶运算符
        else {
            while (top != -1 && precedence(opStack[top]) >= precedence(c)) {
                postfix += pop();
            }
            push(c);
        }
    }
    // 弹出栈中剩余的所有运算符
    while (top != -1) {
        postfix += pop();
    }
    return postfix;
}

int main() {
    string infix = "a+b*c";
    string result = infixToPostfix(infix);
    cout << result << endl; // 一定要记得输出结果!
    return 0;
}

你可以重点检查这几点:有没有完整实现pop函数?遍历中缀表达式的循环是不是写了?最后有没有输出转换结果?栈的push/pop操作是不是同步更新了top值?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:27:13