您的位置:首页 > 编程语言 > Lua

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

2015-08-20 08:36 676 查看


【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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: