公式字符串求值
程序员文章站
2022-07-13 21:06:31
...
import java.util.*;
//公式字符串求值
public class GetStringNumValue
{
//递归解法
public static int GetValue(String exp)
{
return value(exp.toCharArray(),0)[0];
}
//递归函数
public static int[]value(char[]chas,int i)
{
Deque<String>deq=new LinkedList<String>();
int pre=0;
int[]bra=null;
while(i<chas.length&&chas[i]!=')')
{
if(chas[i]>='0'&&chas[i]<='9')
{
pre=pre*10+chas[i++]-'0';
}else if(chas[i]!='(')
{
addNum(deq,pre);
deq.addLast(String.valueOf(chas[i++]));
pre=0;
}else{
//递归操作
bra=value(chas,i+1);
pre=bra[0]; //递归过程中计算的结果
i=bra[1]+1; //递归过程遍历到str的什么位置
}
}
addNum(deq,pre);
return new int[]{GetNum(deq),i};
}
//计算两个数的加法
public static void addNum(Deque<String>deq,int num)
{
if(!deq.isEmpty())
{
int cur=0;
String top=deq.pollLast();
if(top.equals("+")||top.equals("-"))
{
deq.addLast(top);
}
else
{
//字符串转换成整数(计算乘除)
cur=Integer.valueOf(deq.pollLast());
num=top.equals("*")?(cur*num):(cur/num);
}
}
deq.addLast(String.valueOf(num));
}
//获取加减计算的数值
public static int GetNum(Deque<String>deq)
{
int res=0;
boolean add=true;
String cur=null;
int num=0;
while(!deq.isEmpty())
{
cur=deq.pollFirst();
if(cur.equals("+"))
{
add=true;
}else if(cur.equals("-"))
{
add=false;
}else{
num=Integer.valueOf(cur);
res+=add?num:(-num);
}
}
return res;
}
public static void main(String[]args)
{
String str="48*((70-65)-43)+8*1";
String str2="3+(1*4)";
String str3="3+(-1*4)";
System.out.println(GetValue(str));
System.out.println(GetValue(str2));
System.out.println(GetValue(str3));
Scanner sin=new Scanner(System.in);
System.out.println("请输入有效的字符串(例如 3+(-3*4)+(10/2)):");
String info=sin.nextLine();
System.out.println("计算结果为:"+GetValue(info));
}
}