翻译成ab+ab*cd+%-x/y-wz*
然后用堆栈
然后用堆栈
解决方案 »
- hibernate 插入乱码问题
- 跪求此文件下载,分不够了,哪个能下载下来,加我qq253840975 http://download.csdn.net/source/680336
- 我的Myeclipse 为什么没有 run on server
- 难道CSDN上没有人会用struts的validator验证框架来验证数组吗????
- 谁能告诉我这个语句什么意思(jsp)
- 在Jbuilder中非根目录下的JSP编译问题,服务器用TOMCAT则通过,用JBOSS则不过,为什么?
- b页面检索数据库分页显示的时间,要调用从上个a页面传来的参数,但只能现实一页的结果!
- 关于eclipse的简单问题
- 今天突然用TOMCAT时,怎么弹出输入网络密码的对话框?
- 请问各位用什么编jsp呀/我用editplus总是不爽!
- 求java.util.date() 和 java.sql.date() 的相关资料(中文)
- 问个菜的问题!!!
你要是计算含有变量的式子,如你上面的那个:((a + b - (a * b) % (c + d)) / x - y + (w * z))
你可以根据变量的值(假设a,b,c,d,x,y,w,z都等于1),构造一个新的字符串((1+1-(1*1)%(1+1)....
没有处理取余运算,你要是真的需要,看看程序,自己添加吧,
import java.io.*;
import java.util.*;
public class Suan
{
private static int index=-1;
public static void main(String [] args)
{
System.out.println(jisuan("3*(2+3)/(0)-(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;
}
}
如果是这样,那程序还得改一些地方:主要是词法分析的地方