【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>
相关文章推荐
- 【LeetCode-面试算法经典-Java实现】【150-Evaluate Reverse Polish Notation(计算逆波兰式)】
- 设计模式实例(Lua)笔记之二(AbstractFactory抽象工厂模式)
- 设计模式实例(Lua)笔记之一(Factory Method工厂方法模式)
- lua 可变参数
- tolua++的一些api的
- Lua闭包的理解
- Python游戏服务器开发日记(三)用greenlet模拟lua coroutine的研究
- ngx_lua模块学习笔记
- pcall
- Lua 语言基础
- UVA 327 -Evaluating Simple C Expressions(栈)
- as3.0用asxls导出xls文件为luaTabel
- ulua+PureMVC框架简单热更新使用-后续web服务器篇
- luajavabridge 使用过程出现问题的总结
- angluarjs中指令的使用方式
- lua中实现的base64加密
- 【Lua 第一篇】 Manager + Data 的定义与应用
- Lua语言介绍
- ulua
- ****************本文是Lua编写的游戏接入多盟SDK*******************