有关表达式求值的问题(四则运算,带小括号),大虾帮忙,多多给分!

jackie_yubo 2003-01-16 09:10:48
我最近新学java
做表达式求值的时候,在做小括号的时候,处理优先级我要做特殊处理,而且在返回优先级的时候我用的是数值,我觉得以后如果对其他运算符扩展的话,就会很难处理,因为我对这种算法不是很清楚,请问各位大虾,能不能对我的代码有所改进!!!
请帮助一个新手吧!


//分解出数字------------------------------------------------------------------------------
public double FindNum(String s,int n)
{
double sum=0;
int m,len=0;
m=n;
while((s.charAt(m)>='0')&&(s.charAt(m)<='9')||(s.charAt(m)=='.')||(s.charAt(m)=='E')){
len++ ;m++;
if (m==s.length()) break;
}
sum=Double.parseDouble(s.substring(n,n+len));
Pos=n+len;
return sum;
}

//判断字符是否为运算符---------------------------------------------------------------------
public boolean JudgeOper(char chr)
{
for(int i=0;i<operation.length;i++)
{
if (chr==operation[i])
return true;
}
return false;
}

//返回符号的优先级-------------------------------------------------------------------------
public int JudgePri(char oper)
{
switch(oper)
{
case ')': return 4;
case '*': return 3;
case '/': return 3;
case '+': return 2;
case '-': return 2;
case '(': return 1;
case '#': return 0;
default:
System.out.println("Opertion Error!");
System.exit(0);
}
return -1;
}

//判断两个操作符的优先级---------------------------------------------------------------------
public char JudgeTwoOper(char oper1,char oper2)
{
//有关于括号的特殊处理---------------
if (oper2=='(')
return '<';
if ((oper1!='(')&&(oper2==')'))
return '>';
//----------------------------------
if (((oper1=='(')&&(oper2==')'))||((oper1=='#')&&(oper2==oper1)))
return '=';
if (JudgePri(oper1)>=JudgePri(oper2))
return '>';
if (JudgePri(oper1)<JudgePri(oper2))
return '<';
return '0' ;
}

//计算两个操作数的结果------------------------------------------------------------------------
public double Result(double opnd1,double opnd2,char oper)
{
switch(oper)
{
case '*':
return opnd1*opnd2;
case '/':
if (opnd2==0){
System.out.println("Div zero Error!");
break;
}
else return opnd1/opnd2;
case '+':
return opnd1+opnd2;
case '-':
return opnd1-opnd2;
default:
System.out.println("Opertion Error!");
System.exit(0);
}
return 0;
}

//运算流程--------------------------------------------------------------------------------
public double Account(String s)
{
Stack1 value=new Stack1();
Stack2 oper=new Stack2();
oper.push2('#');
char operator;
double a,b;
while(Pos<s.length())
{
if (JudgeOper(s.charAt(Pos))==false){
value.push1(FindNum(s,Pos)); }
else{
//关于正负号的特殊处理------------------------
if(((Pos==0)&&((s.charAt(Pos)=='-')||(s.charAt(Pos)=='+')))||
((Pos>0)&&(s.charAt(Pos-1)=='(')&&((s.charAt(Pos)=='-')||(s.charAt(Pos)=='+'))))
{
value.push1(0);
}

//------------------------------------------
switch(JudgeTwoOper(oper.Gettop2(),s.charAt(Pos)))
{
case '<':
oper.push2(s.charAt(Pos));
Pos++;
break;
case '>':
a=value.pop1();
b=value.pop1();
operator=oper.pop2();
value.push1(Result(b,a,operator));
break;
case '=':
oper.pop2();
Pos++;
break;
}
}
}
return value.Gettop1();
}
}
...全文
67 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧