加减乘除有一种位运算可以计算的,但是我这里只写非位运算的,但它也不涉及到什么算法,只是单纯的coding能力的考察。
不过我感觉会有点复杂,为了记住,我想画几张图。
给定一个字符串为计算式的表达,请返回计算后的结果
ps:给定的字符串绝对正确,不用担心溢出的问题
首先分为有小括号的情况和没有小括号的情况,没有小括号的情况其实也就是乘除需要注意一点,其他都是很简单的;
有小括号的情况我们直接用递归去搞定它。
没有小括号的情况,我们可以直接去遍历字符串,把遍历到的数字或者符号压入栈里或者队列,在压入的时候需要判断,如果原先的栈顶为乘除符号,我们需要先计算好乘除之后再压进去。
最后得到最终结果只需要把栈里面的所有东西都给弹出来做加减就行了。
public static int getValue(String str) { return value(str.toCharArray(), 0)[0]; } //返回数组长度为2, //arr[0]代表计算结果 //arr[1]代表计算到的位置 public static int[] value(char[] str, int i) { LinkedList<String> que = new LinkedList<String>(); int pre = 0; int[] bra = null; 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 = 0; } else { //遇到了"(" bra = value(str, i + 1); pre = bra[0]; i = bra[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; 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<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); res += add ? num : (-num); } } return res; }
原文:https://www.cnblogs.com/carryup/p/13769928.html