基于数组栈的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
相关产品推荐
相关产品推荐

