欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

公式字符串求值

程序员文章站 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));


	 }
} 
公式字符串求值