• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
neverlandly
博客园    首页    新随笔    联系   管理    订阅  订阅

Leetcode: Evaluate Reverse Polish Notation

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:
  ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
  ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

难度:70. RPN中文名字叫做逆波兰表示法,它的好处维基百科说了,就是不需要括号来表示运算的先后,直接根据式子本身就可以求解。解题思路就是维护一个栈,遇到数字就入栈,遇到操作符就两次出栈得到栈顶的两个操作数,运用操作符进行运算以后,再把结果入栈。直到式子结束,此时栈中唯一一个元素便是结果。

以上代码中有一个没有周全的地方是没有对逆波兰式错误的情况进行出错处理,其实也不难,就是每次pop操作检查栈空情况,如果栈空,则说明出错,throw an exception。还有就是最后检查一下栈的size,如果不是1也说明运算数多了,返回错误。

 1 public class Solution {
 2     public int evalRPN(String[] tokens) {
 3         int a,b;
 4         Stack<Integer> S = new Stack<Integer>();
 5         for (String s : tokens) {
 6             if(s.equals("+")) {
 7                 S.add(S.pop()+S.pop());
 8             }
 9             else if(s.equals("/")) {
10                 b = S.pop();
11                 a = S.pop();
12                 S.add(a / b);
13             }
14             else if(s.equals("*")) {
15                 S.add(S.pop() * S.pop());
16             }
17             else if(s.equals("-")) {
18                 b = S.pop();
19                 a = S.pop();
20                 S.add(a - b);
21             }
22             else {
23                 S.add(Integer.parseInt(s));
24             }
25         }    
26         return S.pop();
27     }
28 }

 

posted @ 2014-10-14 07:52  neverlandly  阅读(492)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3