【发布时间】: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是两个独立的令牌8和2和12是单个令牌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/。因为使用多位数字不是我的问题的目标。