您提到的后缀表达式错误,确实是由于在 Trans
函数中处理数字时没有正确将多位数字输出。当前实现只会把每个字符直接加入输出,因此对多位数来说,只会取其第一个字符。
我们需要改进 Trans
函数,以便能正确处理完整的多位数字。以下是更新后的代码片段:
std::string Trans() {
std::stack<char> opStack;
std::ostringstream output;
for (size_t i = 0; i < infix.length(); ++i) {
char ch = infix[i];
if (isdigit(ch)) {
// 如果是数字,则可能为多位数,需要一直读取直到非数字字符
while (i < infix.length() && isdigit(infix[i])) {
output << infix[i++];
}
output << ' '; // 在数字后添加空格
--i; // 因为for循环还会增加i,所以这里减去1以补偿
}
else if (ch == ' ') {
continue; // 跳过空格
}
else {
output << ' '; // 在每个数字和运算符之间加空格
if (ch == '(') {
opStack.push(ch);
}
else if (ch == ')') {
while (!opStack.empty() && opStack.top() != '(') {
output << opStack.top(); // 输出栈顶元素
output << ' '; // 添加空格分隔
opStack.pop();
}
opStack.pop(); // 弹出左括号
}
else {
while (!opStack.empty() && precedence(opStack.top()) >= precedence(ch)) {
output << opStack.top(); // 输出栈顶元素
output << ' '; // 添加空格分隔
opStack.pop();
}
opStack.push(ch); // 当前运算符入栈
}
}
}
while (!opStack.empty()) {
output << opStack.top(); // 输出栈顶元素
output << ' '; // 添加空格分隔
opStack.pop();
}
return output.str();
}
修改内容:
- 在检测到一个数字时,通过一个while循环读取所有连续的数字,直到遇到非数字字符。这允许输入多位数。
- 在找到完整的一个多位数之后,将其后面跟一个空格,以保持格式的一致性。
现在,您可以重新运行程序并尝试输入,例如 “52*(66-55)-31”,它应该返回正确的后缀表达式:52 66 55 - * 31
。
内容由零声教学AI助手提供,问题来源于学员提问