java数学表达式解析器_java实现一个简单的数学表达式分析器(加减乘除和括号)...

更新时间:2023-07-14 08:18:27 阅读: 评论:0

java数学表达式解析器_java实现⼀个简单的数学表达式分析器
(加减乘除和括号)...
1.使⽤此分析器需要输⼊两个量:
String str1=运算符号有前后有空格的数学表达式(如 1 + 2 *  ( 3+1)  - 5 #),并在最后添加‘#’字符作为结束标志;
String str2=⽆空格的分割的数学表达式(如 1+2*(3+1)-5#),同样添加‘#’字符作为结束标志;
2.注:表达式必须严格正确“( )”是不允许存在单个的情况。源代码中有⼀定的检测机制,但现在还不确定是否能够检错所有情况;
使⽤两种输⼊的原因是⽅便于检错和字符串的切割;
3.花了两天晚上写的(包括安卓app),虽然简陋。但是对于我来说还是太肝了。这个是为⾯试学校的⼀个学⽣组织的实验室,准备做的安卓上的计算器中的输⼊分析器(算是核⼼的代码了doge.jpg);因为考虑到可能以后还可以改改,所以就单独写了个⽅法(算是低耦合吧
doge.jpg);
4.注:此代码暂时只能解析含加减乘除和括号的算式。主要核⼼算法思想参考《数据结构C语⾔版 吴伟民著》P53。其他的实现都是⾃⼰写的,把c转为java确实也遇到很多问题。
5.使⽤时使⽤的是EvaluateExpression这个类,创建是⽤构造⽅法EvaluateExpression(str2(不含空格),str1(含空格)),使验收意见怎么写
⽤.doEvaluateExpression()⽅法实现计算(如果返回值为Fal则表⽰输⼊的表达式有误),使⽤.sum得到最后结果。
6.下⾯是步骤:
实现⼀个栈:
光盘怎么刻录public classstrStack {private String[] myStack=new String[80];private int StackLength=0;private int StackPoint=0;public booleanisEmpty(){if(StackLength==0)return true;el
return fal;
}public intgetStacklength(){returnStackLength;
}public booleanpush(String str){if(StackPoint==80)return fal;el{
myStack[StackPoint]=str;
StackLength++;
StackPoint++;return true;
}
}publicString getTop(){if(StackPoint==0){return null;
}el{return myStack[StackPoint-1];
}
}publicString pop(){
String popn=myStack[StackPoint-1];
myStack[StackPoint-1]=null;
StackLength--;
StackPoint--;returnpopn;
}public voidclearStack(){if(!isEmpty()){for(int i=StackLength-1;i>=0;i--){
myStack[i]=null;
}
StackLength=0;
StackPoint=0;
}
}public voidtrevalstack(){for(int i=0;i
System.out.print(" "+myStack[i]);
}
}
}
实现字符串处理类:
public classcutStr {private String[] mystr;//切割后的表达式
private String outstr;//不含空格的表达式
private String outstrhasSpace;//含空格的表达式
publiccutStr(){
日本武士电影
}publiccutStr(String outstr,String outstrhasSpace){this.outstr=outstr;this.outstrhasSpace=outstrhasSpace;//初始化,得到外来字符串
}public String[] ReAddstr(){//切割字符串,将运算符号与数字分开
mystr=outstrhasSpace.split("[ ]+");returnmystr;
}public booleancountsymple(){boolean temp=true;for(int i=0;i
if(outstr.charAt(i)=='+'||outstr.charAt(i)=='-'||outstr.charAt(i)=='*'||outstr.charAt(i)=='/'||outstr.charAt(i)=='.')
{if(outstr.charAt(i+1)=='+'||outstr.charAt(i+1)=='-'||outstr.charAt(i+1)=='*'||outstr.charAt(i+1)=='/'||outstr.charAt(i+1)=='.'){
temp=fal;break;
}
}
}el{//判断最后⼀个字符是否合法
if(outstr.charAt(i)=='+'||outstr.charAt(i)=='-'||outstr.charAt(i)=='*'||outstr.charAt(i)=='/'){
temp=fal;break;
}
}
}returntemp;
}public booleankhnumber(){int kl=0;int kr=0;for(int i=0;i
kl++;if(outstr.charAt(i)==')')
kr++;
}if(kr==kl&&(kr+kl)%2==0)return true;el
return fal;
}public String[] getMystr() {//返回切割后的字符串数组
ReAddstr();returnmystr;
}
}
实现运算符优先级⽐较处理类:
public classPrecede {private char[][] mylist={{'>','>','','>'},
{'>','>','','>'},
{'>','>','>','>','','>'},
{'>','>','>','>','','>'},
{'
{'>','>','>','>',0,'>','>'},
{'
精准表达
intc1n,c2n;
c1n=exchange(c1);
c2n=exchange(c2);returnmylist[c1n][c2n];
}public int exchange(char mychar){//将符号转换为⾃定义数字,⽤于定位表中位置
int temp=-1;switch(mychar){ca '+': temp=0; break;ca '-': temp=1; break;ca '*': temp=2; break;ca '/': temp=3; break;ca '(': temp=4; break;ca ')': temp=5; break;ca '#': temp=6; break;
}returntemp;
}
}
实现运算的操作类:
public classOperate {private doublea;private doubleb;private charthreta;publicOperate(){
}public Operate(double a,char threta,doubleb){this.a=a;this.b=b;this.threta=threta;
}public doubledoOperaate(){double temp=0;switch(threta){ca '+': temp=a+b;break;ca '-': temp=a-b;break;ca '*': temp=a*b;break;ca '/': temp=a/b;break;
}returntemp;
}
}
实现运⾏运算的类:
public classEvaluateExpression {public String sum;//储存计算的最终结果
public boolean jugment=true;//作为表达式是否合法的标志
String outstr,outstrhasSpace;publicEvaluateExpression(String outstr,String outstrhasSpace)
{this.outstr=outstr;this.outstrhasSpace=outstrhasSpace;
荼蘼花语
}public boolean isOP(String x){//判断是否为运算符号的⽅法
if(x.charAt(0)=='+'||x.charAt(0)=='-
'||x.charAt(0)=='*'||x.charAt(0)=='/'||x.charAt(0)=='('||x.charAt(0)==')'||x.charAt(0)=='#')return true;el
return fal;
}public boolean doEvaluateExpression(){//求解过程的⽅法,如果判断表达式错误那么直接结束
Precede pre=newPrecede();
strStack OPTR=newstrStack();
OPTR.push("#");
strStack OPND=newstrStack();
cutStr cS=newcutStr(outstr,outstrhasSpace);
untsymple();
String[] Mystr();
jugment=cS.khnumber();for(int i=0;jugment&&((mystr[i].charAt(0)!='#')||(Top().charAt(0)!='#'));){if(!isOP(mystr[i])) {
OPND.push(mystr[i]);
i++;
}el{switch(pre.Top().charAt(0),mystr[i].charAt(0))){ca '
OPTR.push(mystr[i]);
i++;break;ca '=':
OPTR.pop();
i++;break;ca '>':String thretax=OPTR.pop();char threta=thretax.charAt(0);
河阴String b=OPND.pop();
String a=OPND.pop();double bb=0;double aa=0;try{
bb=Double.parDouble(b);
aa=Double.parDouble(a);
}catch(NumberFormatException e){
jugment=fal;
}
Operate oper=new Operate(aa,threta,bb);//创建⼀个操作对象,并初始化
String numberx=String.valueOf(oper.doOperaate());
OPND.push(numberx);break;ca '0':jugment=fal;break;
}
}/*System.out.print(i);
养宠物的坏处System.out.print(" ");
System.out.print(" ");
文明交通System.out.println(" ");*/}
Top();returnjugment; }
}

本文发布于:2023-07-14 08:18:27,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1080937.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:表达式   实现   字符串   是否
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图