这里是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;感谢您的阅读!
发布于 2013-11-08 06:39:33
使用二叉树,其中每个节点是算术运算符,叶是值。
发布于 2013-11-08 06:40:37
这正是Interpreter pattern要做的事情。你的数学运算基本上就是一种语法--你所需要做的就是表示该语法。使用解释器模式解析数学语句,然后使用它输出的内容执行必要的操作。
发布于 2013-11-08 07:12:35
使用反向波兰语符号以“计算友好”的形式表示您的公式。你可以在这里阅读关于RPN的内容:http://en.wikipedia.org/wiki/Reverse_Polish_notation
2+2*3/2-2的RPN版本为2 2 3*2/2-+
然后算法是这样的:假设RPN版本中的每个符号都是符号数组中的一个元素。您从数组中获取元素,如果这是一个数字,则将其放入堆栈,如果这是一个运算符,则从堆栈中获取两个元素并执行操作。结果应该再次到达堆栈。重复此操作,直到到达数组的最后一个元素。最后,堆栈上只有一个元素,那就是你的答案。
让我们想象一下: iteration#符号堆栈content 1# 2 -> 2 2# 2 -> 2,2 3# 3 -> 3,2,2 4# * -> 6,2 5# 2 -> 2,6,2 6# / -> 3,2 7# 2 -> 2,3,2 8# - -> 1,2 9# + -> 3
https://stackoverflow.com/questions/19848057
复制相似问题