From 997ca1345a441850693b8336c08a41089a0c8746 Mon Sep 17 00:00:00 2001 From: huangge1199 Date: Fri, 9 Apr 2021 16:50:35 +0800 Subject: [PATCH] =?UTF-8?q?150:=E9=80=86=E6=B3=A2=E5=85=B0=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F=E6=B1=82=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/code/leet/entiy/TreeNode.java | 7 +- .../cn/EvaluateReversePolishNotation.java | 125 ++++++++++++++++++ .../cn/EvaluateReversePolishNotation.md | 73 ++++++++++ 3 files changed, 203 insertions(+), 2 deletions(-) create mode 100644 LeetCode/src/main/java/leetcode/editor/cn/EvaluateReversePolishNotation.java create mode 100644 LeetCode/src/main/java/leetcode/editor/cn/EvaluateReversePolishNotation.md diff --git a/LeetCode/src/main/java/com/code/leet/entiy/TreeNode.java b/LeetCode/src/main/java/com/code/leet/entiy/TreeNode.java index edaf30a..281e85b 100644 --- a/LeetCode/src/main/java/com/code/leet/entiy/TreeNode.java +++ b/LeetCode/src/main/java/com/code/leet/entiy/TreeNode.java @@ -32,11 +32,13 @@ public class TreeNode { } List treeNodeList = new ArrayList<>(); int index = 0; + int size = 0; for (int i = 0; i < list.size(); i++) { if (treeNodeList.size() == 0) { this.val = list.get(i); treeNodeList.add(this); index = 0; + size = 1; } else { TreeNode root = treeNodeList.get(index); treeNodeList.remove(index); @@ -56,13 +58,14 @@ public class TreeNode { right = new TreeNode(list.get(i)); root.right = right; treeNodeList.add(index, right); - }else{ + } else { treeNodeList.add(index, null); } index++; } - if (index == treeNodeList.size()*2) { + if (treeNodeList.size() == size * 2) { index = 0; + size = treeNodeList.size(); } } } diff --git a/LeetCode/src/main/java/leetcode/editor/cn/EvaluateReversePolishNotation.java b/LeetCode/src/main/java/leetcode/editor/cn/EvaluateReversePolishNotation.java new file mode 100644 index 0000000..e3f3a69 --- /dev/null +++ b/LeetCode/src/main/java/leetcode/editor/cn/EvaluateReversePolishNotation.java @@ -0,0 +1,125 @@ +//根据 逆波兰表示法,求表达式的值。 +// +// 有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 +// +// +// +// 说明: +// +// +// 整数除法只保留整数部分。 +// 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 +// +// +// +// +// 示例 1: +// +// +//输入:tokens = ["2","1","+","3","*"] +//输出:9 +//解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9 +// +// +// 示例 2: +// +// +//输入:tokens = ["4","13","5","/","+"] +//输出:6 +//解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6 +// +// +// 示例 3: +// +// +//输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"] +//输出:22 +//解释: +//该算式转化为常见的中缀算术表达式为: +// ((10 * (6 / ((9 + 3) * -11))) + 17) + 5 +//= ((10 * (6 / (12 * -11))) + 17) + 5 +//= ((10 * (6 / -132)) + 17) + 5 +//= ((10 * 0) + 17) + 5 +//= (0 + 17) + 5 +//= 17 + 5 +//= 22 +// +// +// +// 提示: +// +// +// 1 <= tokens.length <= 104 +// tokens[i] 要么是一个算符("+"、"-"、"*" 或 "/"),要么是一个在范围 [-200, 200] 内的整数 +// +// +// +// +// 逆波兰表达式: +// +// 逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。 +// +// +// 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。 +// 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。 +// +// +// 逆波兰表达式主要有以下两个优点: +// +// +// 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。 +// 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。 +// +// Related Topics 栈 +// 👍 331 👎 0 + +package leetcode.editor.cn; + +import java.util.Stack; + +//150:逆波兰表达式求值 +public class EvaluateReversePolishNotation { + public static void main(String[] args) { + //测试代码 + Solution solution = new EvaluateReversePolishNotation().new Solution(); + System.out.println(solution.evalRPN(new String[]{"4", "13", "5", "/", "+"})); + } + + //力扣代码 + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public int evalRPN(String[] tokens) { + Stack stack = new Stack<>(); + String op = "+-*/"; + int result = 0; + for (String str : tokens) { + if (op.contains(str) && !stack.isEmpty()) { + int op2 = stack.pop(); + int op1 = stack.pop(); + switch (str) { + case "+": + result = op1 + op2; + break; + case "-": + result = op1 - op2; + break; + case "*": + result = op1 * op2; + break; + case "/": + result = op1 / op2; + break; + default: + break; + } + stack.push(result); + } else { + stack.push(Integer.valueOf(str)); + } + } + return stack.pop(); + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} \ No newline at end of file diff --git a/LeetCode/src/main/java/leetcode/editor/cn/EvaluateReversePolishNotation.md b/LeetCode/src/main/java/leetcode/editor/cn/EvaluateReversePolishNotation.md new file mode 100644 index 0000000..3a47e29 --- /dev/null +++ b/LeetCode/src/main/java/leetcode/editor/cn/EvaluateReversePolishNotation.md @@ -0,0 +1,73 @@ +

根据 逆波兰表示法,求表达式的值。

+ +

有效的算符包括 +-*/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

+ +

 

+ +

说明:

+ +
    +
  • 整数除法只保留整数部分。
  • +
  • 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
  • +
+ +

 

+ +

示例 1:

+ +
+输入:tokens = ["2","1","+","3","*"]
+输出:9
+解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
+
+ +

示例 2:

+ +
+输入:tokens = ["4","13","5","/","+"]
+输出:6
+解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
+
+ +

示例 3:

+ +
+输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
+输出:22
+解释:
+该算式转化为常见的中缀算术表达式为:
+  ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
+= ((10 * (6 / (12 * -11))) + 17) + 5
+= ((10 * (6 / -132)) + 17) + 5
+= ((10 * 0) + 17) + 5
+= (0 + 17) + 5
+= 17 + 5
+= 22
+ +

 

+ +

提示:

+ +
    +
  • 1 <= tokens.length <= 104
  • +
  • tokens[i] 要么是一个算符("+""-""*""/"),要么是一个在范围 [-200, 200] 内的整数
  • +
+ +

 

+ +

逆波兰表达式:

+ +

逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

+ +
    +
  • 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 )
  • +
  • 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * )
  • +
+ +

逆波兰表达式主要有以下两个优点:

+ +
    +
  • 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
  • +
  • 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。
  • +
+
Related Topics
  • \n
  • 👍 331
  • 👎 0
  • \ No newline at end of file