【发布时间】:2021-12-24 03:14:45
【问题描述】:
我目前正在尝试为作业编写 RPN 计算器,但遇到了一些问题。方法 evaluateCountdown 用于接收包含用逆波兰表示法编写的数学表达式的字符串,并将计算表达式的结果作为双精度值返回。
例如:字符串“3.0 4.0 + 2.0 *”应该以双精度形式返回 14.0。
#include <string>
#include <sstream>
#include <vector>
#include <iterator>
#include <stack>
class CountdownSolution {
std::vector<std::string> stringToVector(const std::string newString,const char token)
{
std::vector<std::string> stringVector;
size_t posLast = 0, pos = 0;
while((pos = newString.find(token, pos)) != std::string::npos)
{
if(newString[pos] != newString[posLast])
stringVector.push_back(newString.substr(posLast, pos - posLast));
posLast = ++pos;
}
if(newString[posLast] != 0)
stringVector.push_back(newString.substr(posLast));
return stringVector;
}
double evaluateCountdown(const std::string& rpnString) {
std::vector<std::string> rpnStringVector = stringToVector(rpnString,' ');
std::stack<double> rpnStack;
int i = 0;
double temp;
for (std::vector<std::string>::iterator t=rpnStringVector.begin(); t!=rpnStringVector.end(); ++t)
{
if(rpnStringVector[i] == "+"){
temp = std::stod(rpnStringVector[i-2])+std::stod(rpnStringVector[i-1]);
rpnStack.pop();
rpnStack.pop();
rpnStack.push(temp);
i++;
continue;
} else if(rpnStringVector[i] == "-"){
temp = std::stod(rpnStringVector[i-2])-std::stod(rpnStringVector[i-1]);
rpnStack.pop();
rpnStack.pop();
rpnStack.push(temp);
i++;
continue;
} else if(rpnStringVector[i] == "*"){
temp = std::stod(rpnStringVector[i-2])*std::stod(rpnStringVector[i-1]);
rpnStack.pop();
rpnStack.pop();
rpnStack.push(temp);
i++;
continue;
} else if(rpnStringVector[i] == "/"){
temp = std::stod(rpnStringVector[i-2])/std::stod(rpnStringVector[i-1]);
rpnStack.pop();
rpnStack.pop();
rpnStack.push(temp);
i++;
continue;
} else {
rpnStack.push(std::stod(rpnStringVector[i]));
i++;
continue;
}
}
return rpnStack.top();
}
}
在以下 4 次测试中,我只通过了 1 次。
#include <iostream>
using std::cout;
using std::endl;
#include <string>
int main() {
int retval = 0;
{
double answer = evaluateCountdown(std::string("3.0 4.0 +"));
if (answer == 7.0) {
cout << "1) Pass: evaluated '3.0 4.0 +', got 7.0\n";
} else {
cout << "1) Fail: evaluated '3.0 4.0 +' expecting 7.0, but got " << answer << std::endl;
++retval;
}
}
{
double answer = evaluateCountdown(std::string("3.0 4.0 - 4.0 +"));
if (answer == 3.0) {
cout << "2) Pass: evaluated '3.0 4.0 - 4.0 +', got 3.0\n";
} else {
cout << "2) Fail: evaluated '3.0 4.0 - 4.0 +' expecting 3.0, but got " << answer << std::endl;
++retval;
}
}
{
double answer = evaluateCountdown(std::string("3.0 4.0 - 2.0 *"));
if (answer == -2.0) {
cout << "3) Pass: evaluated '3.0 4.0 - 2.0 *', got -2.0\n";
} else {
cout << "3) Fail: evaluated '3.0 4.0 - 2.0 *' expecting -2.0, but got " << answer << std::endl;
++retval;
}
}
{
double answer = evaluateCountdown(std::string("100 20 / 4 +"));
if (answer == 9) {
cout << "4) Pass: evaluated '100 20 / 4 +', got 9\n";
} else {
cout << "4) Fail: evaluated '100 20 / 4 +' expecting 9, but got " << answer << std::endl;
++retval;
}
}
return retval;
}
这是我运行测试的输出。
- 通过:评估为 '3.0 4.0 +',获得 7.0
- 失败:评估 '3.0 4.0 - 4.0 +' 期望 3.0,但得到 -1
- 失败:评估 '3.0 4.0 - 2.0 *' 期望 -2.0,但得到 -1
- 失败:评估 '100 20 / 4 +' 期望 9,但得到 5
我可以从我的结果中看到 for 循环只遍历向量的前 3 个元素,但我不知道为什么。
【问题讨论】:
-
对于 #2 到 #4,看起来您的处理超出了第一个运算符。
标签: c++ vector stack calculator rpn