【LeetCode-面试算法经典-Java实现】【151-Evaluate Reverse Polish Notation(计算逆波兰式)】

来源:互联网 发布:旅游网络销售范围 编辑:程序博客网 时间:2024/06/05 09:06

【LeetCode-面试算法经典-Java实现】【所有题目目录索引】

原题

  Evaluate the value of an arithmetic expression in Reverse Polish Notation. 
 Valid operators are +, -, *, /. Each operand may be an integer or another expression. 
  Some examples:

<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial; ">  [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">"2"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">"1"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">"+"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">"3"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">"*"</span>]<span class="hljs-function" style="box-sizing: border-box; "> -></span> <span class="hljs-function" style="box-sizing: border-box; "><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box; ">((<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; ">2</span> + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; ">1</span>) * <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; ">3</span>)</span> -></span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; ">9</span>  [<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">"4"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">"13"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">"5"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">"/"</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">"+"</span>]<span class="hljs-function" style="box-sizing: border-box; "> -></span> <span class="hljs-function" style="box-sizing: border-box; "><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box; ">(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; ">4</span> + (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; ">13</span> / <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; ">5</span>))</span> -></span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; ">6</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; "><li style="box-sizing: border-box; padding: 0px 5px; ">1</li><li style="box-sizing: border-box; padding: 0px 5px; ">2</li></ul>

题目大意

   计算逆波半表达式的值,有效的运算符是:+、-、*、/,每个操作数要么是一个整数要么是另一个表达式 

解题思路

  使用栈进行操作 

代码实现

算法实现类

<code class="hljs cs has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial; ">import java.util.Stack;<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">class</span> Solution {    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">int</span> <span class="hljs-title" style="box-sizing: border-box; ">evalRPN</span>(String[] tokens) {        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; ">// 参数校验</span>        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">if</span> (tokens == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">null</span> || tokens.length < <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; ">1</span>) {            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">new</span> IllegalArgumentException();        }        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">int</span> op1;        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">int</span> op2;        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; ">// 操作数栈</span>        Stack<Integer> stack = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">new</span> Stack<>();        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">for</span> (String token: tokens) {            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; ">// 说明是运算符,要取栈顶两个元素进行运算</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">if</span> (<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">"+"</span>.equals(token) || <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">"-"</span>.equals(token) || <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">"*"</span>.equals(token) || <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">"/"</span>.equals(token)) {                <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; ">// 取栈顶元素</span>                op2 = stack.pop();                op1 = stack.pop();                <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; ">// 进行运算</span>                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">switch</span> (token.charAt(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box; ">0</span>)) {                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">case</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">'+'</span>:                        op1 += op2;                        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">break</span>;                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">case</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">'-'</span>:                        op1 -= op2;                        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">break</span>;                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">case</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">'*'</span>:                        op1 *= op2;                        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">break</span>;                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">case</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box; ">'/'</span>:                        op1 /= op2;                        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">break</span>;                }                <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; ">// 结果入栈</span>                stack.push(op1);            }            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box; ">// 说明是操作数,入栈</span>            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">else</span> {                stack.push(Integer.parseInt(token));            }        }        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box; ">return</span> stack.pop();    }}</code>
0 0