求解给定的数学式字符串

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public static int getValue(String str) {
		return value(str.toCharArray(),0)[0];
	}
	
	//back[0]返回的是计算结果
	//back[1]返回的计算到的位置
	public static int [] value(char [] str,int i) {
		LinkedList<String>que=new LinkedList<String>();
		int pre=0;
		int [] back=null;
		//当i未到终点并且没有遇到右括号
		while(i<str.length && str[i]!=')') {
			if(str[i]>='0'&&str[i]<='9') {
				pre=pre*10+str[i++]-'0';
			}
			//说明遇到了加减乘除
			else if(str[i]!='(') {
				//子程序去处理加减乘除
				//如果是+-直接添加,乘除运算后添加到链表
				addNum(que,pre);
				//把符号放入链表中
				que.addLast(String.valueOf(str[i++]));
				//清空pre用来接收下次的值
				pre=0;
			}
			//遇到了(
			else {
				//开始递归,从i+1的位置开始
				back=value(str,i+1);
				pre=back[0];
				i=back[1]+1;
			}
		}
		//将最后一个数加入到链表中
		addNum(que,pre);
		//将剩下的+-求和
		return new int[] {getNum(que),i};
	}
	
	public static void addNum(LinkedList<String>que,int num) {
		if(!que.isEmpty()) {
			int cur=0;
			// 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null
			String top=que.pollLast();
			//如果获得+-就将他们存入链表中
			if(top.equals("+") || top.equals("-")){
				que.addLast(top);
			}
			//如果获得*/就将它们的结果计算出来,再添加回链表末尾
			else {
				//返回保存指定的 String 的值的 Integer 对象。
				cur=Integer.valueOf(que.pollLast());
				num=top.equals("*")?(cur*num):(cur/num);
			}
		}
		//将指定元素添加到此列表的结尾
		//返回 int参数的字符串表示形式
		que.addLast(String.valueOf(num));
	}
	
	//计算到这一步式子中一定只有+-,求和
	public static int getNum(LinkedList<String>que) {
		int res=0;
		boolean add=true;
		String cur=null;
		int num=0;
		while(!que.isEmpty()) {
			//弹出链表的头节点
			cur=que.pollFirst();
			if(cur.equals("+")) {
				add=true;
			}else if(cur.equals("-")) {
				add=false;
		}else {
			num=Integer.valueOf(cur);
			//add是true就+num,否则-num
			res+=add?num:(-num);
		}
	}
		return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值