给定一个字符串str,str表示一个公式,公式里可能有整数、加减乘除符号和左右括号,返回公式的计算结果。
创始人
2024-03-19 10:59:33
0

问题描述:

        给定一个字符串str,str表示一个公式,公式里可能有整数、加减乘除符号和左右括号,返回公式的计算结果。
【举例】

        str="48*((70-65)-43)+81",返回-1816。
        str="3+1*4",返回7。
        str="3+(1*
4)",返回7。
【说明】

        1.可以认为给定的字符串一定是正确的公式,即不需要对str做公式有效性检查。

        2.如果是负数,就需要用括号括起来,比如"4*(-3)"。但如果负数作为公式的开头 或括号部分的开头,则可以没有括号,比如"-3*4"和"(-3*4)"都是合法的。

        3.不用考虑计算过程中会发生溢出的情况。

思想:

        本题可以使用递归的方法。从左到右遍历str,如果遇到左括号就进入递归,相当于将括号里的内容当成一个新的公式,等括号里的内容计算完成后将结果返回,此时再接着继续遍历str,直到str遍历完或者遇到右括号,这样就相当于str中不再包含左右括号。递归过程需要返回两个结果,一个是当前子公式计算的结果,一个是当前遍历到的str的位置。这样上级递归函数就可以根据这两个数据继续向后遍历。计算公式的结果时,先将乘法和除法计算完,最后再统一计算计算加法和减法。

代码:

    public static int getValue(String str) {return value(str.toCharArray(), 0)[0];}//从str[i...]往下算,遇到字符串终止为止或者右括号就停止//返回两个数,长度为2的数组//0)负责这一段的结果是多少//1)负责这一段计算到了那个位置public static int[] value(char[] str, int i) {LinkedList que = new LinkedList<>();int cur = 0;int[] bra = null;//从i出发,开始撸串while (i < str.length && str[i] != ')') {if (str[i] >= '0' && str[i] <= '9') {cur = cur * 10 + str[i++] - '0';} else if (str[i] != '(') {//遇到的是运算符号addNum(que, cur);que.addLast(String.valueOf(str[i++]));cur = 0;} else {//遇到左括号bra = value(str, i + 1);cur = bra[0];i = bra[1] + 1;}}addNum(que, cur);return new int[]{getNum(que), i};}public static void addNum(LinkedList que, int num) {if (!que.isEmpty()) {int cur = 0;String top = que.pollLast();if (top.equals("+") || top.equals("-")) {que.addLast(top);} else {cur = Integer.valueOf(que.pollLast());num = top.equals("*") ? (cur * num) : (cur / num);}}que.addLast(String.valueOf(num));}public static int getNum(LinkedList 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);res += add ? num : (-num);}}return res;}public static void main(String[] args) {String exp = "48*((70-65)-43)+8*1";System.out.println(getValue(exp));exp = "4*(6+78)+53-9/2+45*8";System.out.println(getValue(exp));exp = "10-5*3";System.out.println(getValue(exp));exp = "-3*4";System.out.println(getValue(exp));exp = "3+1*4";System.out.println(getValue(exp));}

相关内容

热门资讯

汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
SAP PS 第9节 合并采购... SAP PS 第9节 合并采购申请、组合WBS之影响1 合并采购申请1.1 合并采购申请后台配置1....
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...