怎样计算一个动态4则运算式呢? 比如: 3 x 2000 + 6 x 3 + 1 这样类似的四则运算式,式子内容是动态生成的,但是java里面好像没有脚本中eval函数可以求运算结果的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 hehe,JDK没有现成的。不过网上有很多现成的。无非是用一个或者两个Stack来解决。 import java.io.*;import java.util.*;public class Hello{private static int index=-1;public static void main(String [] args){System.out.println(jisuan("3*(2+3)/(5)-(1-2)*2"));System.out.println(jisuan("3*(2+3)/(5-5)-(1-2)*2"));}private static double jisuan(String s){LinkedList<Token>oper=new LinkedList<Token>();oper.addFirst(new Token('#',-1));LinkedList<Double>num=new LinkedList<Double>();String t="";for(int i=0;i<s.length();i++){if(s.charAt(i)=='('){if(t.equals("")!=true){num.addFirst(new Double(t));t="";}oper.addFirst(new Token('(',0));}if(s.charAt(i)==')'){if(t.equals("")!=true){num.addFirst(new Double(t));t="";}while(true){Token cur=oper.removeFirst();if(cur.c=='(')break;double d2=num.removeFirst();double d1=num.removeFirst();if(cur.c=='+')num.addFirst(d1+d2);if(cur.c=='-')num.addFirst(d1-d2);if(cur.c=='*')num.addFirst(d1*d2);if(cur.c=='/'){if(d2==0){System.out.println("除数为0");System.exit(1);}num.addFirst(d1/d2);}}}if(s.charAt(i)=='+'){if(t.equals("")!=true){num.addFirst(new Double(t));t="";}Token tnew=new Token('+',1);while(true){Token cur=oper.removeFirst();if(tnew.level>cur.level){oper.addFirst(cur);oper.addFirst(tnew);break;}else{double d2=num.removeFirst();double d1=num.removeFirst();if(cur.c=='+')num.addFirst(d1+d2);if(cur.c=='-')num.addFirst(d1-d2);if(cur.c=='*')num.addFirst(d1*d2);if(cur.c=='/'){if(d2==0){System.out.println("除数为0");System.exit(1);}num.addFirst(d1/d2);}}}}if(s.charAt(i)=='-'){if(t.equals("")!=true){num.addFirst(new Double(t));t="";}Token tnew=new Token('-',1);while(true){Token cur=oper.removeFirst();if(tnew.level>cur.level){oper.addFirst(cur);oper.addFirst(tnew);break;}else{double d2=num.removeFirst();double d1=num.removeFirst();if(cur.c=='+')num.addFirst(d1+d2);if(cur.c=='-')num.addFirst(d1-d2);if(cur.c=='*')num.addFirst(d1*d2);if(cur.c=='/'){if(d2==0){System.out.println("除数为0");System.exit(1);}num.addFirst(d1/d2);}}}}if(s.charAt(i)=='*'){if(t.equals("")!=true){num.addFirst(new Double(t));t="";}Token tnew=new Token('*',2);while(true){Token cur=oper.removeFirst();if(tnew.level>cur.level){oper.addFirst(cur);oper.addFirst(tnew);break;}else{double d2=num.removeFirst();double d1=num.removeFirst();if(cur.c=='+')num.addFirst(d1+d2);if(cur.c=='-')num.addFirst(d1-d2);if(cur.c=='*')num.addFirst(d1*d2);if(cur.c=='/'){if(d2==0){System.out.println("除数为0");System.exit(1);}num.addFirst(d1/d2);}}}}if(s.charAt(i)=='/'){if(t.equals("")!=true){num.addFirst(new Double(t));t="";}Token tnew=new Token('/',2);while(true){Token cur=oper.removeFirst();if(tnew.level>cur.level){oper.addFirst(cur);oper.addFirst(tnew);break;}else{double d2=num.removeFirst();double d1=num.removeFirst();if(cur.c=='+')num.addFirst(d1+d2);if(cur.c=='-')num.addFirst(d1-d2);if(cur.c=='*')num.addFirst(d1*d2);if(cur.c=='/'){if(d2==0){System.out.println("除数为0");System.exit(1);}num.addFirst(d1/d2);}}}}if(s.charAt(i)>='0'&&s.charAt(i)<='9'||s.charAt(i)=='.')t+=s.charAt(i);}if(t.equals("")!=true)num.addFirst(new Double(t));while(oper.size()>1){Token cur=oper.removeFirst();double d2=num.removeFirst();double d1=num.removeFirst();if(cur.c=='+'){num.addFirst(d1+d2);}if(cur.c=='-')num.addFirst(d1-d2);if(cur.c=='*')num.addFirst(d1*d2);if(cur.c=='/'){if(d2==0){System.out.println("除数为0");System.exit(1);}num.addFirst(d1/d2);}}return num.getFirst();}}class Token{public char c;public int level;//运算优先级 :(:0 +:1 -:1 *:2 /:2 ):3public Token(char c,int level){this.c=c;this.level=level;} public String toString(){return ""+c+" "+level;}} to cxydbydyq(紅衣主教) 有就最好了.没有也可以接受 java版数据结构 。有意思。。学习ing..... md ,这个 laji 问题 100 多个人问过了,就不能查查历史?我服了,问问题的人能不能勤快一点儿? 我的Eclipse变成这样了求 询问InputStream 请教java问题 JComboBox动态更新问题 看看以下两道题如何实现? 大家快来抢分啊! !!!100分求解一个很简单的问题,在线等候!急用!谢谢! j2se 1.4.1 Beta NOW AVAILABLE! 奇怪,为什么char ch='\u10100'编译错误,而char ch='\ujava'编译成功呢? 并发编程题 请教动态代理类 在AWT里边怎样才能缩放图片,我用的Component,Image类,使用resize()方法不好用啊。求助。。。。。。
不过网上有很多现成的。无非是用一个或者两个Stack来解决。
import java.util.*;
public class Hello
{
private static int index=-1;
public static void main(String [] args)
{
System.out.println(jisuan("3*(2+3)/(5)-(1-2)*2"));
System.out.println(jisuan("3*(2+3)/(5-5)-(1-2)*2"));
}
private static double jisuan(String s)
{
LinkedList<Token>oper=new LinkedList<Token>();
oper.addFirst(new Token('#',-1));
LinkedList<Double>num=new LinkedList<Double>();
String t="";
for(int i=0;i<s.length();i++)
{
if(s.charAt(i)=='(')
{
if(t.equals("")!=true)
{
num.addFirst(new Double(t));
t="";
}
oper.addFirst(new Token('(',0));
}
if(s.charAt(i)==')')
{
if(t.equals("")!=true)
{
num.addFirst(new Double(t));
t="";
}
while(true)
{
Token cur=oper.removeFirst();
if(cur.c=='(')break;
double d2=num.removeFirst();
double d1=num.removeFirst();
if(cur.c=='+')
num.addFirst(d1+d2);
if(cur.c=='-')
num.addFirst(d1-d2);
if(cur.c=='*')
num.addFirst(d1*d2);
if(cur.c=='/')
{
if(d2==0)
{
System.out.println("除数为0");
System.exit(1);
}
num.addFirst(d1/d2);
}
}
}
if(s.charAt(i)=='+')
{
if(t.equals("")!=true)
{
num.addFirst(new Double(t));
t="";
}
Token tnew=new Token('+',1);
while(true)
{
Token cur=oper.removeFirst();
if(tnew.level>cur.level)
{
oper.addFirst(cur);
oper.addFirst(tnew);
break;
}
else
{
double d2=num.removeFirst();
double d1=num.removeFirst();
if(cur.c=='+')
num.addFirst(d1+d2);
if(cur.c=='-')
num.addFirst(d1-d2);
if(cur.c=='*')
num.addFirst(d1*d2);
if(cur.c=='/')
{
if(d2==0)
{
System.out.println("除数为0");
System.exit(1);
}
num.addFirst(d1/d2);
}
}
}
}
if(s.charAt(i)=='-')
{
if(t.equals("")!=true)
{
num.addFirst(new Double(t));
t="";
}
Token tnew=new Token('-',1);
while(true)
{
Token cur=oper.removeFirst();
if(tnew.level>cur.level)
{
oper.addFirst(cur);
oper.addFirst(tnew);
break;
}
else
{
double d2=num.removeFirst();
double d1=num.removeFirst();
if(cur.c=='+')
num.addFirst(d1+d2);
if(cur.c=='-')
num.addFirst(d1-d2);
if(cur.c=='*')
num.addFirst(d1*d2);
if(cur.c=='/')
{
if(d2==0)
{
System.out.println("除数为0");
System.exit(1);
}
num.addFirst(d1/d2);
}
}
}}
if(s.charAt(i)=='*')
{
if(t.equals("")!=true)
{
num.addFirst(new Double(t));
t="";
}
Token tnew=new Token('*',2);
while(true)
{
Token cur=oper.removeFirst();
if(tnew.level>cur.level)
{
oper.addFirst(cur);
oper.addFirst(tnew);
break;
}
else
{
double d2=num.removeFirst();
double d1=num.removeFirst();
if(cur.c=='+')
num.addFirst(d1+d2);
if(cur.c=='-')
num.addFirst(d1-d2);
if(cur.c=='*')
num.addFirst(d1*d2);
if(cur.c=='/')
{
if(d2==0)
{
System.out.println("除数为0");
System.exit(1);
}
num.addFirst(d1/d2);
}
}
}}
if(s.charAt(i)=='/')
{
if(t.equals("")!=true)
{
num.addFirst(new Double(t));
t="";
}
Token tnew=new Token('/',2);
while(true)
{
Token cur=oper.removeFirst();
if(tnew.level>cur.level)
{
oper.addFirst(cur);
oper.addFirst(tnew);
break;
}
else
{
double d2=num.removeFirst();
double d1=num.removeFirst();
if(cur.c=='+')
num.addFirst(d1+d2);
if(cur.c=='-')
num.addFirst(d1-d2);
if(cur.c=='*')
num.addFirst(d1*d2);
if(cur.c=='/')
{
if(d2==0)
{
System.out.println("除数为0");
System.exit(1);
}
num.addFirst(d1/d2);
}
}
}}
if(s.charAt(i)>='0'&&s.charAt(i)<='9'||s.charAt(i)=='.')
t+=s.charAt(i);}
if(t.equals("")!=true)
num.addFirst(new Double(t));
while(oper.size()>1)
{
Token cur=oper.removeFirst();
double d2=num.removeFirst();
double d1=num.removeFirst();
if(cur.c=='+')
{
num.addFirst(d1+d2);
}
if(cur.c=='-')
num.addFirst(d1-d2);
if(cur.c=='*')
num.addFirst(d1*d2);
if(cur.c=='/')
{
if(d2==0)
{
System.out.println("除数为0");
System.exit(1);
}
num.addFirst(d1/d2);
}}return num.getFirst();}
}
class Token
{
public char c;
public int level;//运算优先级 :(:0 +:1 -:1 *:2 /:2 ):3
public Token(char c,int level)
{
this.c=c;
this.level=level;
}
public String toString()
{
return ""+c+" "+level;
}
}
我服了,问问题的人能不能勤快一点儿?