【问题标题】:basic calculator, using Reverse Polish Notation基本计算器,使用逆波兰表示法
【发布时间】:2021-11-29 14:55:06
【问题描述】:

我正在尝试使用从string 获取输入并输出double 的逆波兰表示法制作一个基本计算器。输入是:82+5*8-4/ 在标准表示法中应该读作(((8 + 2) * 5) - 8) / 4

想要的输出是 10.5,但我的输出是 106.962。

你能解释一下我做错了什么吗?

据我所知,我在双切换字符串中做错了,但我是 C++ 的新手,我不知道问题到底出在哪里。

这是我尝试过的:

#include <iostream>

int main() {

    std::string input = "82+5*8-4/";
    double output, num;
    num = input.at(0);

    for (int i = 1; i < input.size() - 1; i = i + 2) {
        switch (input.at(i + 1)) {
            case '+':
                output = num + input.at(i);
                break;
            case '-':
                output = num - input.at(i);
                break;
            case '*':
                output = num * input.at(i);
                break;
            case '/':
                output = num / input.at(i);
                break;
            default:
                break;
        }
        num = output;
    }
    std::cout << output << std::endl;    
    return (0);
}

【问题讨论】:

  • 没有字符编码,例如1 == '1'。您必须将数字字符转换为其对应的整数值。这通常通过正常的减法来完成,如input[i] - '0'
  • 另外你怎么知道82 是两个独立的令牌8212 是单个令牌12?您的代码似乎没有尝试读取多位数字
  • 对于 RPN,您需要以下内容: - 推送操作(“输入”,您可以为此使用另一个字符,例如 #)。 - 一个临时字符串,您可以在其中收集多字符数字 - 一堆数字 - 以及一个操作,该操作也从堆栈中提取数字 您的示例字符串不是 RPN。 “(((8 + 2) * 5) - 12) / 4”的 RPN 将是“8#2+#5*#12-#4/”,假设“#”是您的输入字符。您可能会在这里阅读更多内容:en.wikipedia.org/wiki/Reverse_Polish_notation
  • 您应该坚持在输入数字中用空格或运算符分隔。这使您可以区分 82 和 8 2。
  • 我将问题从:input = 82+5*12-4/ 编辑为:input = 82+5*8-4/。因为使用多位数字不是我的问题的目标。

标签: c++ string double


【解决方案1】:

使用 cmets,我现在可以工作了:

#include <iostream>

int main() {

    std::string input = "82+5*8-4/";
    double output, num1;
    num1 = input[0] - '0';
    

    for (int i = 1; i < input.size() - 1; i = i + 2) {
        double num2 = input[i] - '0';

        switch (input.at(i + 1)) {
            case '+':
                output = num1 + num2;
                break;
            case '-':
                output = num1 - num2;
                break;
            case '*':
                output = num1 * num2;
                break;
            case '/':
                output = num1 / num2;
                break;
            default:
                break;
        }
        num1 = output;
    }
    std::cout << output << std::endl;    
    return (0);
}

【讨论】:

  • 大概对于多位数字,您需要一个分隔符,例如数字之间的空格
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2015-06-15
相关资源
最近更新 更多