我要求用户输入一个表达式,该表达式将以后缀表示法进行评估。表达式的开头是变量名,其中将存储已计算表达式的答案。例如:A 4 5 * 6 + 2 * 1 - 6/4 2 + 3 * * =其中A是变量名,等号表示表达式的答案将存储在变量A中.OUT A语句表示存储在变量A中的数字将被打印出来。
我需要帮助的是,当我输入第二个表达式时,我得不到正确的答案。例如,我的第一个表达式A 4 5 * 6 + 2 * 1 - 6/4 2 + 3 * * =将评估为153,然后当我输入第二个表达式BA 10 * 35.50 + =时,它必须评估为1565.5 ,但事实并非如此。它的评估值为35.5。我无法弄清楚为什么我得到了错误的答案。另外,我需要OUT语句的帮助。
答案 0 :(得分:1)
要在后续表达式中使用先前的符号名,请将其添加到解析循环中的if语句:
iscroll-probe.js
此外,您需要通过引用传递mapVars以在Eval调用中累积其内容:
else if (expr1[i] >= 'A' && expr1[i] <= 'Z')
{
stackIt.push(mapVars1[expr[i]]);
}
对于输出(或任何)其他命令,我建议首先解析字符串前面的命令令牌。然后根据命令字符串调用不同的赋值器。在尝试将字符串作为算术赋值命令进行求值之后,您正试图立即检查OUT。你需要先做出这个选择。
答案 1 :(得分:1)
else if (isalpha(expr1[i]))
{
stackIt.push(mapVars1[expr1[i]]);
}
将变量放置,如果尚未设置变量,则将其置零。
else if (isalpha(expr1[i]))
{
map<char, double>::iterator found = mapVars1.find(expr1[i]);
if (found != mapVars1.end())
{
stackIt.push(found->second);
}
else
{
// error message and exit loop
}
}
可能更好。
其他建议:
编译器这些天非常尖锐,但你可能会从char cur = expr1[i];
中稍微用一点,然后使用cur(或适当的描述性变量名)来代替循环中剩余的expr1[i]
。< / p>
考虑使用isdigit
代替expr1[i] >= '0' && expr1[i] <= '9'
在运算符之后的行或空格中使用多个空格的表达式测试代码。看起来您将重新添加您解析的最后一个数字。
测试123a456之类的输入。你可能不喜欢这个结果。
如果在表达式协议中指定了表达式中每个标记之后的空格,则将输入字符串放入字符串流将允许您删除大量的解析代码。
stringstream in(expr1);
string token;
while (in >> token)
{
if (token == "+" || token == "-'" || ...)
{
// operator code
}
else if (token == "=")
{
// equals code
}
else if (mapVars1.find(token) != mapVars1.end())
{
// push variable
}
else if (token.length() > 0)
{
char * endp;
double val = strtod(token.c_str(), &endp);
if (*endp == '\0')
{
// push val
}
}
}