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

【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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值