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

思路:

看着挺简单,只要一个栈存数字,遇到运算符就把两个数pop出来,计算后再放进去。

class Solution {
        public:
                int evalRPN(vector<string> &tokens) {
                        int size = tokens.size();
                        stack<int> nums;
                        int a,b;
                        for(int i=0;i<size;i++){
                                if(tokens[i].length()==1){
                                        switch(tokens[i].at(0)){
                                                case '+':
                                                        a=nums.top();nums.pop();
                                                        b=nums.top();nums.pop();
                                                        nums.push(b+a);
                                                        break;
                                                case '-':
                                                        a=nums.top();nums.pop();
                                                        b=nums.top();nums.pop();
                                                        nums.push(b-a);
                                                        break;

                                                case '*':
                                                        a=nums.top();nums.pop();
                                                        b=nums.top();nums.pop();
                                                        nums.push(b*a);
                                                        break;
                                                case '/':
                                                        a=nums.top();nums.pop();
                                                        b=nums.top();nums.pop();
                                                        nums.push(b/a);
                                                        break;
                                                default:
                                                        a=atoi(tokens[i].c_str());
                                                        nums.push(a);
                                                        break;

                                        }
                                }else{
                                        a=atoi(tokens[i].c_str());
                                        nums.push(a);
                                }
                        }
                        return nums.top();
                }


};

第一次提交代码时for里面没有if判断的,结果遇到负数的案例出错了,一时没想到更简便的写法,就按上面的提交了。

别人代码:

private static final SetOPERATORS = 
      new HashSet<>(Arrays.asList("+", "-", "*", "/"));

public int evalRPN(String[] tokens) {
   Stack stack = new Stack<>();
   for (String token : tokens) {
      if (OPERATORS.contains(token)) {
         int y = stack.pop();
         int x = stack.pop();
         stack.push(eval(x, y, token));
      } else {
         stack.push(Integer.parseInt(token));
      }
   }
   return stack.pop();
}

private int eval(int x, int y, String operator) {
   switch (operator) {
      case "+": return x + y;
      case "-": return x - y;
      case "*": return x * y;
      default:  return x / y;
   }
}


ps:

c++想用atoi,需包含cstdlib

转载于:https://my.oschina.net/u/2244980/blog/531098

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值