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


    问题描述:

            给定一个字符串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的位置。这样上级递归函数就可以根据这两个数据继续向后遍历。计算公式的结果时,先将乘法和除法计算完,最后再统一计算计算加法和减法。

    代码:

    1. public static int getValue(String str) {
    2. return value(str.toCharArray(), 0)[0];
    3. }
    4. //从str[i...]往下算,遇到字符串终止为止或者右括号就停止
    5. //返回两个数,长度为2的数组
    6. //0)负责这一段的结果是多少
    7. //1)负责这一段计算到了那个位置
    8. public static int[] value(char[] str, int i) {
    9. LinkedList que = new LinkedList<>();
    10. int cur = 0;
    11. int[] bra = null;
    12. //从i出发,开始撸串
    13. while (i < str.length && str[i] != ')') {
    14. if (str[i] >= '0' && str[i] <= '9') {
    15. cur = cur * 10 + str[i++] - '0';
    16. } else if (str[i] != '(') {//遇到的是运算符号
    17. addNum(que, cur);
    18. que.addLast(String.valueOf(str[i++]));
    19. cur = 0;
    20. } else {//遇到左括号
    21. bra = value(str, i + 1);
    22. cur = bra[0];
    23. i = bra[1] + 1;
    24. }
    25. }
    26. addNum(que, cur);
    27. return new int[]{getNum(que), i};
    28. }
    29. public static void addNum(LinkedList que, int num) {
    30. if (!que.isEmpty()) {
    31. int cur = 0;
    32. String top = que.pollLast();
    33. if (top.equals("+") || top.equals("-")) {
    34. que.addLast(top);
    35. } else {
    36. cur = Integer.valueOf(que.pollLast());
    37. num = top.equals("*") ? (cur * num) : (cur / num);
    38. }
    39. }
    40. que.addLast(String.valueOf(num));
    41. }
    42. public static int getNum(LinkedList que) {
    43. int res = 0;
    44. boolean add = true;
    45. String cur = null;
    46. int num = 0;
    47. while (!que.isEmpty()) {
    48. cur = que.pollFirst();
    49. if (cur.equals("+")) {
    50. add = true;
    51. } else if (cur.equals("-")) {
    52. add = false;
    53. } else {
    54. num = Integer.valueOf(cur);
    55. res += add ? num : (-num);
    56. }
    57. }
    58. return res;
    59. }
    60. public static void main(String[] args) {
    61. String exp = "48*((70-65)-43)+8*1";
    62. System.out.println(getValue(exp));
    63. exp = "4*(6+78)+53-9/2+45*8";
    64. System.out.println(getValue(exp));
    65. exp = "10-5*3";
    66. System.out.println(getValue(exp));
    67. exp = "-3*4";
    68. System.out.println(getValue(exp));
    69. exp = "3+1*4";
    70. System.out.println(getValue(exp));
    71. }

  • 相关阅读:
    固体火箭发动机三维装药逆向内弹道计算
    什么是组织孤岛?它会带来哪些影响?可以这样去对付它
    我的创作纪念日
    调用API post请求
    罗正雄:基于展开交替优化的盲超分算法DAN
    Springboot jar运行时,将jar内的文件拷贝到文件系统中
    CSS动画 animation VS transition
    UART协议及串口回环
    用了一个月的Docker,我真的是爱了
    梯度下降法 --- 吴恩达深度学习笔记
  • 原文地址:https://blog.csdn.net/z1171127310/article/details/128187697