Redian新闻
>
I started my bottom fishing
avatar
I started my bottom fishing# Stock
f*x
1
比如
String str = "1 + 2 * 3 /4"
输出2.5
我的思路是
两个队列
一个存数字
一个存运算符号
遍历放入队列,如果有* /,则计算完了* / 结果再放入队列
然后通过两个队列计算
但是如果有括号就不知道怎么搞了
avatar
s*8
2
in X, average down UCO
out 1/3 of my FXP
avatar
f*3
3
典型的parse,要建Abstract syntac tree (AST), 树结构,然后每个节点evaluate
左边,eveluate右边,最后apply operator
这个例子的AST:
+
/\
1 /
/\
* 4
/\
2 3

【在 f********x 的大作中提到】
: 比如
: String str = "1 + 2 * 3 /4"
: 输出2.5
: 我的思路是
: 两个队列
: 一个存数字
: 一个存运算符号
: 遍历放入队列,如果有* /,则计算完了* / 结果再放入队列
: 然后通过两个队列计算
: 但是如果有括号就不知道怎么搞了

avatar
v*m
4
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
public class TestOfStringToMath {
public static void main(String[] args) throws Exception{
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String foo = "1 + 2 * 3 /4";
System.out.println(engine.eval(foo));
}
}
google到的,编译通过。
With JDK1.6, you can use the built-in Javascript engine.
http://stackoverflow.com/questions/3422673/evaluating-a-math-ex

【在 f********x 的大作中提到】
: 比如
: String str = "1 + 2 * 3 /4"
: 输出2.5
: 我的思路是
: 两个队列
: 一个存数字
: 一个存运算符号
: 遍历放入队列,如果有* /,则计算完了* / 结果再放入队列
: 然后通过两个队列计算
: 但是如果有括号就不知道怎么搞了

avatar
s*e
5
可以参考任何一本数据结构书。
表达式求值的常用方法是用堆栈解决。一个operand栈一个operator栈。
avatar
f*3
6
这个像是cheating,不过要看出题人要求了

【在 v**********m 的大作中提到】
: import javax.script.ScriptEngineManager;
: import javax.script.ScriptEngine;
: public class TestOfStringToMath {
: public static void main(String[] args) throws Exception{
: ScriptEngineManager mgr = new ScriptEngineManager();
: ScriptEngine engine = mgr.getEngineByName("JavaScript");
: String foo = "1 + 2 * 3 /4";
: System.out.println(engine.eval(foo));
: }
: }

avatar
v*m
7
那只能用你二楼的那个思路了。

【在 f**********3 的大作中提到】
: 这个像是cheating,不过要看出题人要求了
avatar
f*x
8

evaluate
Thanks!
那括号的话就是括号内的生成树就行了

【在 f**********3 的大作中提到】
: 典型的parse,要建Abstract syntac tree (AST), 树结构,然后每个节点evaluate
: 左边,eveluate右边,最后apply operator
: 这个例子的AST:
: +
: /\
: 1 /
: /\
: * 4
: /\
: 2 3

avatar
s*u
9
没有括号的话,用longway大神发过的方法。有括号的话,可以先转换成后缀。
avatar
n*e
10
能贴下“longway大神发过的方法”吗? 多谢!

【在 s********u 的大作中提到】
: 没有括号的话,用longway大神发过的方法。有括号的话,可以先转换成后缀。
avatar
o*r
11
You need to:
1) convert it into post-fix expression by using stack, which will eliminate
any brackets ( ).
2) compute result using stack.
There are many resources available online about 'Infix to postfix expression
' algorithm.
avatar
f*x
12

eliminate
expression
Thanks!

【在 o*********r 的大作中提到】
: You need to:
: 1) convert it into post-fix expression by using stack, which will eliminate
: any brackets ( ).
: 2) compute result using stack.
: There are many resources available online about 'Infix to postfix expression
: ' algorithm.
:

avatar
l*n
13
可以用recursion,找到第一个乘法,用计算结果替代原算式,如此继续。
有括号的话,可以先找最右边的左括号,并用计算结果替代原算式。
当然,这种解法是比较naive的,真的应用实现还得上逆波兰式。

【在 f********x 的大作中提到】
: 比如
: String str = "1 + 2 * 3 /4"
: 输出2.5
: 我的思路是
: 两个队列
: 一个存数字
: 一个存运算符号
: 遍历放入队列,如果有* /,则计算完了* / 结果再放入队列
: 然后通过两个队列计算
: 但是如果有括号就不知道怎么搞了

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。