Java 带四个运算符的字符串表达式
这里是CS学生。我希望能够获取字符串,如“2+2*3/2-2”,并对其求值(=3)。但我不确定如何构造代码以遵循正确的操作顺序。下面是乘法和除法的代码:Java 带四个运算符的字符串表达式,java,string,operators,expression,Java,String,Operators,Expression,这里是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 == '*'
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;
intr=1;
int n=0;
char op='*';
对于(int i=0;i
谢谢你的阅读 使用二叉树,其中每个节点都是算术运算符,叶子是值。这正是。你的数学运算基本上是一种语法——你所需要做的就是表示这种语法。使用解释器模式解析您的数学语句,然后使用它吐出的内容执行必要的操作。使用反向波兰符号以“计算友好”的形式表示您的公式。 您可以在此处阅读有关RPN的内容: 您的2+2*3/2-2的RPN版本将是2*2/2-+ 那么算法是这样的: 假设RPN版本中的每个符号都是符号数组中的一个元素。 从数组中获取元素,如果这是一个数字,则将其放在堆栈上,如果这是运算符,则从堆栈中获取两个元素并执行操作。结果应再次落在堆栈上。重复此操作,直到到达数组的最后一个元素。最后,堆栈上只有一个元素是您的答案 让我们想象一下: 迭代#符号堆栈内容 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您需要解析表达式。简单的递归下降解析器可以做到这一点:
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);
}
当然,上面的内容不会涉及字符串中的空格、括号或其他您可能关心的内容,但它们可以相对容易地添加。是否有括号?您可能会在+1处发现一些有趣的信息,然后从叶子开始自下而上计算,直到到达根节点。我不确定这是什么。我刚开始编程。已经有几个月没做了。