150:逆波兰表达式求值

This commit is contained in:
huangge1199 2021-04-09 16:50:35 +08:00
parent bd1e12ff7e
commit 997ca1345a
3 changed files with 203 additions and 2 deletions

View File

@ -32,11 +32,13 @@ public class TreeNode {
}
List<TreeNode> 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();
}
}
}

View File

@ -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<Integer> 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)
}

View File

@ -0,0 +1,73 @@
<p>根据<a href="https://baike.baidu.com/item/%E9%80%86%E6%B3%A2%E5%85%B0%E5%BC%8F/128437" target="_blank"> 逆波兰表示法</a>,求表达式的值。</p>
<p>有效的算符包括 <code>+</code><code>-</code><code>*</code><code>/</code> 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。</p>
<p> </p>
<p><strong>说明:</strong></p>
<ul>
<li>整数除法只保留整数部分。</li>
<li>给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。</li>
</ul>
<p> </p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>tokens = ["2","1","+","3","*"]
<strong>输出:</strong>9
<strong>解释:</strong>该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>tokens = ["4","13","5","/","+"]
<strong>输出:</strong>6
<strong>解释:</strong>该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
</pre>
<p><strong>示例 3</strong></p>
<pre>
<strong>输入:</strong>tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
<strong>输出:</strong>22
<strong>解释:</strong>
该算式转化为常见的中缀算术表达式为:
((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</pre>
<p> </p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 <= tokens.length <= 10<sup>4</sup></code></li>
<li><code>tokens[i]</code> 要么是一个算符(<code>"+"</code><code>"-"</code><code>"*"</code><code>"/"</code>),要么是一个在范围 <code>[-200, 200]</code> 内的整数</li>
</ul>
<p> </p>
<p><strong>逆波兰表达式:</strong></p>
<p>逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。</p>
<ul>
<li>平常使用的算式则是一种中缀表达式,如 <code>( 1 + 2 ) * ( 3 + 4 )</code></li>
<li>该算式的逆波兰表达式写法为 <code>( ( 1 2 + ) ( 3 4 + ) * )</code></li>
</ul>
<p>逆波兰表达式主要有以下两个优点:</p>
<ul>
<li>去掉括号后表达式无歧义,上式即便写成 <code>1 2 + 3 4 + * </code>也可以依据次序计算出正确结果。</li>
<li>适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。</li>
</ul>
<div><div>Related Topics</div><div><li></li></div></div>\n<div><li>👍 331</li><li>👎 0</li></div>