ZBLOG

#include #include #include #include class Express { private: std::string infix; public: Express(const std::string& exp) : infix(exp) {} bool isMatch() { std::stack s; for ...

您提到的后缀表达式错误,确实是由于在 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();
}

修改内容:

  1. 在检测到一个数字时,通过一个while循环读取所有连续的数字,直到遇到非数字字符。这允许输入多位数。
  2. 在找到完整的一个多位数之后,将其后面跟一个空格,以保持格式的一致性。

现在,您可以重新运行程序并尝试输入,例如 “52*(66-55)-31”,它应该返回正确的后缀表达式:52 66 55 - * 31


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=20562

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?