From 94f49558a60579a5de20207421f11098cc3e436a Mon Sep 17 00:00:00 2001 From: algorithmzuo Date: Wed, 11 Jan 2023 14:32:11 +0800 Subject: [PATCH] modify code --- .../class071/Code04_ExpressionCompute.java | 68 ++++++------------- .../class118/Code01_ExpressionCompute.java | 50 +++++--------- .../class08/Code01_ExpressionCompute.java | 50 +++++--------- 3 files changed, 58 insertions(+), 110 deletions(-) diff --git a/公开课/class071/Code04_ExpressionCompute.java b/公开课/class071/Code04_ExpressionCompute.java index 47c1644..cda5846 100644 --- a/公开课/class071/Code04_ExpressionCompute.java +++ b/公开课/class071/Code04_ExpressionCompute.java @@ -10,72 +10,48 @@ public class Code04_ExpressionCompute { } // 请从str[i...]往下算,遇到字符串终止位置或者右括号,就停止 - // 返回两个值,长度为2的数组 int[] ans - // ans[0] 负责的这一段的结果是多少 - // ans[1] 负责的这一段,算到了哪个位置停止的 + // 返回两个值,长度为2的数组 + // 0) 负责的这一段的结果是多少 + // 1) 负责的这一段计算到了哪个位置 public static int[] f(char[] str, int i) { - // 12 + 345 - 5 * - LinkedList que = new LinkedList(); + LinkedList queue = new LinkedList(); int cur = 0; int[] bra = null; // 从i出发,开始撸串 while (i < str.length && str[i] != ')') { - if (str[i] >= '0' && str[i] <= '9') { //遇到数字字符 + if (str[i] >= '0' && str[i] <= '9') { cur = cur * 10 + str[i++] - '0'; } else if (str[i] != '(') { // 遇到的是运算符号 - // cur = 34 str[i] = '+' - addNum(que, cur); - que.addLast(String.valueOf(str[i++])); + addNum(queue, cur, str[i++]); cur = 0; } else { // 遇到左括号了 - // ( - // i i+1 bra = f(str, i + 1); cur = bra[0]; i = bra[1] + 1; } } - // 1)终止了!2)遇到右括号了 - addNum(que, cur); - return new int[] { getNum(que), i }; + addNum(queue, cur, '+'); + return new int[] { getAns(queue), 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); - } + public static void addNum(LinkedList queue, int num, char op) { + if (!queue.isEmpty() && (queue.peekLast().equals("*") || queue.peekLast().equals("/"))) { + String top = queue.pollLast(); + int pre = Integer.valueOf(queue.pollLast()); + num = top.equals("*") ? (pre * num) : (pre / num); } - que.addLast(String.valueOf(num)); + queue.addLast(String.valueOf(num)); + queue.addLast(String.valueOf(op)); } - 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); - } + public static int getAns(LinkedList queue) { + int ans = Integer.valueOf(queue.pollFirst()); + while (queue.size() > 1) { + String op = queue.pollFirst(); + int num = Integer.valueOf(queue.pollFirst()); + ans += op.equals("+") ? num : -num; } - return res; - } - - public static void main(String[] args) { - String test = "52+13*(5+2-(5*(23-4)))-40+((3*2)+(5/2))"; - System.out.println(calculate(test)); + return ans; } } diff --git a/公开课/class118/Code01_ExpressionCompute.java b/公开课/class118/Code01_ExpressionCompute.java index 015c7ff..f5e687a 100644 --- a/公开课/class118/Code01_ExpressionCompute.java +++ b/公开课/class118/Code01_ExpressionCompute.java @@ -25,7 +25,7 @@ public class Code01_ExpressionCompute { // 0) 负责的这一段的结果是多少 // 1) 负责的这一段计算到了哪个位置 public static int[] f(char[] str, int i) { - LinkedList que = new LinkedList(); + LinkedList queue = new LinkedList(); int cur = 0; int[] bra = null; // 从i出发,开始撸串 @@ -33,8 +33,7 @@ public class Code01_ExpressionCompute { 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++])); + addNum(queue, cur, str[i++]); cur = 0; } else { // 遇到左括号了 bra = f(str, i + 1); @@ -42,41 +41,28 @@ public class Code01_ExpressionCompute { i = bra[1] + 1; } } - addNum(que, cur); - return new int[] { getNum(que), i }; + addNum(queue, cur, '+'); + return new int[] { getAns(queue), 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); - } + public static void addNum(LinkedList queue, int num, char op) { + if (!queue.isEmpty() && (queue.peekLast().equals("*") || queue.peekLast().equals("/"))) { + String top = queue.pollLast(); + int pre = Integer.valueOf(queue.pollLast()); + num = top.equals("*") ? (pre * num) : (pre / num); } - que.addLast(String.valueOf(num)); + queue.addLast(String.valueOf(num)); + queue.addLast(String.valueOf(op)); } - 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); - } + public static int getAns(LinkedList queue) { + int ans = Integer.valueOf(queue.pollFirst()); + while (queue.size() > 1) { + String op = queue.pollFirst(); + int num = Integer.valueOf(queue.pollFirst()); + ans += op.equals("+") ? num : -num; } - return res; + return ans; } } diff --git a/大厂刷题班/class08/Code01_ExpressionCompute.java b/大厂刷题班/class08/Code01_ExpressionCompute.java index 6d1192b..9474a91 100644 --- a/大厂刷题班/class08/Code01_ExpressionCompute.java +++ b/大厂刷题班/class08/Code01_ExpressionCompute.java @@ -14,7 +14,7 @@ public class Code01_ExpressionCompute { // 0) 负责的这一段的结果是多少 // 1) 负责的这一段计算到了哪个位置 public static int[] f(char[] str, int i) { - LinkedList que = new LinkedList(); + LinkedList queue = new LinkedList(); int cur = 0; int[] bra = null; // 从i出发,开始撸串 @@ -22,8 +22,7 @@ public class Code01_ExpressionCompute { 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++])); + addNum(queue, cur, str[i++]); cur = 0; } else { // 遇到左括号了 bra = f(str, i + 1); @@ -31,41 +30,28 @@ public class Code01_ExpressionCompute { i = bra[1] + 1; } } - addNum(que, cur); - return new int[] { getNum(que), i }; + addNum(queue, cur, '+'); + return new int[] { getAns(queue), 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); - } + public static void addNum(LinkedList queue, int num, char op) { + if (!queue.isEmpty() && (queue.peekLast().equals("*") || queue.peekLast().equals("/"))) { + String top = queue.pollLast(); + int pre = Integer.valueOf(queue.pollLast()); + num = top.equals("*") ? (pre * num) : (pre / num); } - que.addLast(String.valueOf(num)); + queue.addLast(String.valueOf(num)); + queue.addLast(String.valueOf(op)); } - 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); - } + public static int getAns(LinkedList queue) { + int ans = Integer.valueOf(queue.pollFirst()); + while (queue.size() > 1) { + String op = queue.pollFirst(); + int num = Integer.valueOf(queue.pollFirst()); + ans += op.equals("+") ? num : -num; } - return res; + return ans; } }