CS学生在这里。我希望能够采用诸如'2 + 2 * 3 / 2-2'之类的字符串并对其进行评估(= 3)。但我不确定如何构造代码以遵循正确的操作顺序。这是乘法和除法的代码:
int r = 1;
int n = 0;
char op = '*';
for (int i = 0; i < E.length(); i++)
if (E.charAt(i)=='*'||E.charAt(i)=='/')
{
if (op == '*')
r *= n;
else
r /= n;
n = 0;
op = E.charAt(i);
}
else
n = n*10 + (E.charAt(i)-'0');
if (op == '*')
r *= n;
else
r /= n;
return r;
感谢阅读!
答案 0 :(得分:2)
使用二叉树,其中每个节点都是算术运算符,叶子是值。
答案 1 :(得分:0)
这正是Interpreter pattern的意图。你的数学运算基本上是一个语法 - 你需要做的只是代表语法。使用Interpreter模式解析数学语句,然后使用它吐出的内容来执行必要的操作。
答案 2 :(得分:0)
使用反向波兰表示法以“计算友好”形式表示您的公式。 您可以在此处阅读有关RPN的信息:http://en.wikipedia.org/wiki/Reverse_Polish_notation
你的2 + 2 * 3 / 2-2的RPN版本将是2 2 3 * 2/2 - +
然后算法是这样的: 假设来自RPN版本的每个符号是符号数组中的元素。 你从数组中获取元素,如果这是一个数字,如果这是一个操作符,则从堆栈中取出两个元素并执行操作。结果应该再次落在堆栈上。重复,直到到达数组的最后一个元素。最后,你的堆栈中只有一个元素就是你的答案。
让我们想象一下: 迭代#符号堆栈内容 1#2 - &gt; 2 2#2 - &gt; 2,2 3#3 - &gt; 3,2,2 4#* - &gt; 6,2 5#2 - &gt; 2,6,2 6#/ - &gt; 3,2 7#2 - &gt; 2,3,2 8# - - &gt; 1,2 9#+ - &gt; 3
答案 3 :(得分:0)
您需要解析表达式。一个简单的递归下降解析器可以做到这一点:
double expression(const char **p) {
double rv = term(p);
while (**p) {
if (**p = '+') {
++*p;
rv += term(p)
} else if (**p = '-') {
++*p;
rv -= term(p);
} else
break; }
return rv; }
double term(const char **p) {
double rv = factor(p);
while (**p) {
if (**p = '*') {
++*p;
rv *= factor(p)
} else if (**p = '/') {
++*p;
rv /= factor(p);
} else
break; }
return rv; }
double factor(const char **p) {
return strtod(p, (char **)&p);
}
当然,以上内容不会处理字符串中的空格,括号或其他您可能关心的内容,但可以相对容易地添加它们。