公式字符串求值

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));


	 }
} 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值