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

基于数组栈的C++中缀转后缀程序异常求助:输出含^2且结果不符合预期

排查中缀转后缀程序的逻辑错误

我仔细看了你的代码,发现几个关键问题导致了输出出现^2乱码和转换结果不符的情况,咱们一个个来揪出这些bug:

1. Pop函数的致命逻辑错误

你的Pop()函数完全搞反了栈的弹出顺序!现在的代码是先执行--top再返回元素,这意味着你每次拿到的是栈顶的前一个元素,而真正的栈顶元素还留在栈里(后续操作会导致读出内存里的随机值,比如你看到的^2大概率就是这个原因)。

修正后的Pop()函数:

char stack::Pop() {
    if (isEmpty()) {
        cout << "The Array is already empty" << endl;
        return 0; // 返回默认值避免未定义行为
    } else {
        return astack[top--]; // 先返回当前栈顶,再将top减一
    }
}

2. 运算符优先级函数缺失break

你的precedence()函数里的switch case没有加break,这会导致每个case都向下“穿透”执行。比如当运算符是+时,会先把weight设为1,然后继续执行*//的case把weight改成2,最后执行$的case改成3——结果所有运算符的优先级都变成3了,完全打乱了中缀转后缀的核心逻辑!

修正后的precedence()函数:

int precedence(char element) {
    int weight = -1;
    switch (element) {
    case '+':
    case '-':
        weight = 1;
        break; // 必须加break终止当前case
    case '*':
    case '/':
        weight = 2;
        break;
    case '$':
        weight = 3;
        break;
    }
    return weight;
}

3. Clear函数的数组创建错误

你的clear()函数里new char(size)是创建单个字符,其值为size,而不是创建一个大小为size的字符数组。同时删除数组时要用delete[]而不是delete,否则会导致内存泄漏。

修正后的clear()函数:

void stack::clear() {
    top = -1;
    delete[] astack; // 数组必须用delete[]释放
    astack = new char[size]; // 正确创建size大小的字符数组
};

4. 中缀转后缀的核心逻辑漏洞

在处理运算符的部分,你现在的逻辑是:当当前运算符优先级小于等于栈顶时,弹出栈顶元素,但循环结束后没有把当前运算符压入栈,这会导致这个运算符直接丢失!而且循环里的两个if判断完全重复,可以简化。

修正后的main函数中运算符处理部分:

else if (IsOperator(element)) { // 用else if更严谨,避免无效判断
    while (!postfix->isEmpty() && precedence(element) <= precedence(postfix->Peek())) {
        post += postfix->Pop();
    }
    postfix->Push(element); // 循环结束后必须将当前运算符压入栈
}

5. 其他小细节优化

  • print()函数的循环条件应该改为i <= ptr->top,否则最后一个栈元素不会被打印出来;
  • main()中记得在最后释放栈的内存,避免内存泄漏。

完整修正后的代码

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

class stack {
public:
    int top;
    char* astack;
    int size;
    stack(int s) {
        size = s;
        top = -1;
        astack = new char[size];
    }
    void Push(char element);
    char Pop();
    bool isEmpty();
    bool isFull();
    char Peek();
    void clear();
    void print(stack* ptr);
};

char stack::Peek() {
    if (isEmpty()) {
        return 0;
    }
    return astack[top];
}

void stack::clear() {
    top = -1;
    delete[] astack;
    astack = new char[size];
};

void stack::Push(char element) {
    if (isFull()) {
        cout << "The stack is already Full" << endl;
        return;
    }
    astack[++top] = element;
}

char stack::Pop() {
    if (isEmpty()) {
        cout << "The Array is already empty" << endl;
        return 0;
    } else {
        return astack[top--];
    }
}

void stack::print(stack* ptr) {
    for (int i = 0; i <= ptr->top; i++) {
        cout << ptr->astack[i];
    }
}

bool stack::isEmpty() {
    return top == -1;
}

bool stack::isFull() {
    return top == size - 1;
}

int precedence(char element) {
    int weight = -1;
    switch (element) {
    case '+':
    case '-':
        weight = 1;
        break;
    case '*':
    case '/':
        weight = 2;
        break;
    case '$':
        weight = 3;
        break;
    }
    return weight;
}

bool IsOperator(char C) {
    return (C == '+' || C == '-' || C == '*' || C == '/' || C == '$');
}

bool IsOperand(char C) {
    if (C >= '0' && C <= '9') return true;
    if (C >= 'a' && C <= 'z') return true;
    if (C >= 'A' && C <= 'Z') return true;
    return false;
}

int main() {
    string infix;
    getline(cin, infix);
    string post = "";
    stack* postfix = new stack(50);
    
    for (int i = 0; i != infix.size(); i++) {
        char element = infix[i];
        if (IsOperand(element)) {
            post += element;
        } else if (IsOperator(element)) {
            while (!postfix->isEmpty() && precedence(element) <= precedence(postfix->Peek())) {
                post += postfix->Pop();
            }
            postfix->Push(element);
        }
        // 注意:如果你的输入包含括号,还需要添加括号的处理逻辑
    }
    
    while (!postfix->isEmpty()) {
        post += postfix->Pop();
    }
    
    cout << "Postfix expression is : " << post << endl;
    delete postfix; // 记得释放栈的内存
}

现在运行修正后的代码,输入对应的中缀表达式(比如对应预期输出576/1*-6+的输入),就能得到正确的转换结果,同时^2的乱码问题也会消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 04:32:39