67,513
社区成员
发帖
与我相关
我的任务
分享
public static void jsTest(){
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
try{
String script = "function js(){return (1+1)*3/2+1; }";
engine.eval(script);
Invocable inv = (Invocable) engine;
Double res=(Double)inv.invokeFunction("js");
System.out.println(res);
}catch(Exception e){
e.printStackTrace();
}
}
不知道这个可以不,仅供参考。[/quote]可以得出结果 但是为什么 要写js代码? 求原理[/quote]
使用了js引擎啊,js实现了这个,java调用js来实现这是js的 题目要求用 java写 [quote=引用 8 楼 haha_321 的回复:] 记得有个java处理js的方法叫eval 是不是这个方法?
public static void jsTest(String strValue){
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
try{
String script = "function js(){return "+strValue+"; }";
engine.eval(script);
Invocable inv = (Invocable) engine;
Double res=(Double)inv.invokeFunction("js");
System.out.println(res);
}catch(Exception e){
e.printStackTrace();
}
}
不知道这个可以不,仅供参考。[/quote]
学习大神了#include <iostream>
#include <stack>
#include <string>
using namespace std;
/*规则:从左到右遍历中缀表达式的每一数字和符号,若是数字就输出,
即成为后缀表达式的一部分;若是符号,则判断其与栈 顶符号的优先
级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次
出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
*/
void suff(string &exp ,string & post)
{
stack<char> p;
int i;
int m;
char a;
for(i=0;exp[i]!='#';i++)
{
if(exp[i]>='0'&&exp[i]<='9')
{
post+=exp[i];
}
else
{
if(p.size()==0||exp[i]=='(')
{
p.push(exp[i]);
}
else if(exp[i]==')')
{
m=p.size();
while(m)
{
a=p.top();
p.pop();
if(a=='(')
{
break;
}
post+=a;
m--;
}
}
else if(exp[i]=='+'||exp[i]=='-')
{
if(p.top()=='*'||p.top()=='/')
{
m=p.size();
while(m)
{
a=p.top();
p.pop();
post+=a;
m--;
}
}
else
{
p.push(exp[i]);
}
}
else
{
p.push(exp[i]);
}
}
}
if(p.size())
{
m=p.size();
while(m)
{
a=p.top();
p.pop();
post+=a;
m--;
}
}
cout<<post<<endl;
}
void calculate(string & post)
{
stack<int> q;
int i;
int a,b;
for(i=0;post[i]!='\0';i++)
{
if(post[i] >= '0' && post[i] <= '9')
q.push(post[i]-48);
else //当前元素为符号则取出栈顶两个元素计算,并把计算结果入栈;
{
a = q.top();
q.pop();
b = q.top();
q.pop();
switch(post[i])
{
case '+' : q.push(a+b); break;
case '-' : q.push(b-a); break;
case '*' : q.push(a*b); break;
case '/' : q.push(b/a); break;
}
}
}
a = q.top();
cout << a << endl;
}
各位兄台不用那么麻烦,有现成的,我刚做的项目有用到这个计算规则,楼主结贴给分吧 用这个jar:commons-jexl,直接度娘吧
你的意思是用 正则表达式? 否则的话 里面的 运算符不好判断 [quote=引用 1 楼 lgc8023 的回复:] 先将字符串里的数值强行转化成int型,再做处理
[quote=引用 46 楼 ADF1230 的回复:] 1,用栈来算; 2,编译原理中的DFA分析词法,LL(1)分析文法,再遍历子节点,递归算结果。
将字符串转换为ASC2码,再判断每个ASC2码的范围判断是数字还是符号,数字的转成INT,然后计算就可以了吧
1,用栈来算; 2,编译原理中的DFA分析词法,LL(1)分析文法,再遍历子节点,递归算结果。