我当时没有学逆波兰式,所以自己想出了一个方法,就是对每一个操作数,看前面和后面的操作符
用一个变量cf记录乘(除)法的值,然后分情况讨论
因为每一对括号里面的式子和原来的式子有相同的结构,故利用dfs来消去括号
当消去所有括号后,最后使用getanswer方法求值
package com.zkx;
public class small {
public static double getanswer(String s)
{
s+="+0";
double ans=0,cf=1,x=0;
int f=0,t=0,l=s.length();
for(int i=0;i<l;++i)
{
boolean flag=false;
if(i==0&&s.charAt(i)=='-')
{
flag=true;
i++;
t++;
}
else if(i>0&&s.charAt(i)=='-'&&(s.charAt(i-1)>'9'||s.charAt(i-1)<'0'))
{
flag=true;
i++;
t++;
}
while(t<l)
{
if(s.charAt(t)!='.'&&(s.charAt(t)<'0'||s.charAt(t)>'9'))
break;
t++;
}
x=Double.parseDouble(s.substring(i,t));
if(flag)
{
x=-x;
}
if(x==0)
{
if(f==3)
{
return 1.0/0.0;
}
break;
}
i=t;
t++;
if(s.charAt(i)=='x'||s.charAt(i)=='÷')
{
if(f==0)
{
cf*=x;
}
else if(f==1)
{
cf*=-x;
}
else if(f==2)
{
cf*=x;
}
else
{
cf/=x;
}
}
else
{
if(f==0)
{
ans+=x;
}
else if(f==1)
{
ans-=x;
}
else if(f==2)
{
cf*=x;
ans+=cf;
cf=1;
}
else
{
cf/=x;
ans+=cf;
cf=1;
}
}
if(s.charAt(i)=='+')
{
f=0; //上一次符号
}
else if(s.charAt(i)=='-')
{
f=1;
}
else if(s.charAt(i)=='x')
{
f=2;
}
else
{
f=3;
}
}
return ans;
}
public static double dfs(String s)
{
int l=s.length(),kh=0,t=0,f=0;
double x=0;
String ss="";
for(int i=0;i<l;++i)
{
if(s.charAt(i)=='(')
{
kh=1;
break;
}
}
if(kh==0)
{
return getanswer(s);
}
for(int i=0;i<l;++i)
{
if(s.charAt(i)=='(')
{
t++;
f=i;
while(t!=0)
{
f++;
if(s.charAt(f)=='(')
{
t++;
}
if(s.charAt(f)==')')
{
t--;
}
}
x=dfs(s.substring(i+1,f));
i=f;
if(x==1.0/0)
{
return x;
}
ss+=x;
}
else
ss+=s.charAt(i);
}
return dfs(ss);
}
}