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

题目相关

       首先复习一下逆波兰表达式的相关知识:

      逆波兰表达式的解释器一般是基于堆栈的。解释过程一般是:操作数入栈;遇到操作符时,操作数出栈,求值,将结果入栈;当一遍后,栈顶就是表达式的值。因此逆波兰表达式的求值使用堆栈结构很容易实现,并且能很快求值。

       下面以(a+b)*c为例子进行说明: 
(a+b)*c的逆波兰式为ab+c*,假设计算机把ab+c*按从左到右的顺序压入栈中,并且按照遇到运算符就把栈顶两个元素出栈,执行运算,得到的结果再入栈的原则来进行处理,那么ab+c*的执行结果如下: 

      a入栈(0位置);
      b入栈(1位置);
      遇到运算符“+”,将a和b出栈,执行a+b的操作,得到结果d=a+b,再将d入栈(0位置);
      c入栈(1位置);
      遇到运算符“*”,将d和c出栈,执行d*c的操作,得到结果e,再将e入栈(0位置)。
      经过以上运算,计算机就可以得到(a+b)*c的运算结果e了。

     逆波兰式计算等式的实现非常容易,使用堆栈即可完成。在程序中,需要实现整数与字符串之间的相互转换。
 

示例代码

C++:

class Solution {
public:
    int evalRPN(vector<string> &tokens) {
        if (tokens.size() == 0)
            return 0;
        stack<int> stack_num;
        for(int i = 0; i < tokens.size(); i++)
        {
            string s = tokens[i];
            if(s == "+" || s == "-" || s == "*" || s == "/")
               {
                   if(stack_num.size() < 2)
                       return 0;
                   int secondNum = stack_num.top();
                   stack_num.pop();
                   int firstNum = stack_num.top();
                   stack_num.pop();
                   int result = getResult(firstNum, secondNum, s);
                   stack_num.push(result);
               }
              else
               {
                   stack_num.push(atoi(s.c_str()));
               }
    }
               return stack_num.top();
    }
    int getResult(int firstNum, int secondNum, string s)
    {
       if(s == "+")
           return firstNum + second  Num;
        else if(s == "-")
            return firstNum - secondNum;
        else if(s == "*")
            return firstNum*secondNum;
        else if(s == "/")
            return firstNum/secondNum;
        return 0;
    }
};

Java:

import java.util.Stack;
public class Solution {
    public int evalRPN(String[] tokens) {
        if(tokens.length == 0)
            return 0;
        int right = 0;
        int left = 0;
        int result = 0;
        Stack<Integer>  stack = new Stack<Integer>();
        for (int i = 0; i < tokens.length; i++)
        {
            if(tokens[i].equals("+"))
            {
                right = stack.pop();
                left = stack.pop();
                result = right + left;
                stack.push(result);
            }else if(tokens[i].equals("-"))
            {
                right = stack.pop();
                left = stack.pop();
                result = left - right;
                stack.push(result);
            } else if(tokens[i].equals("*"))
            {
                right = stack.pop();
                left = stack.pop();
                result = left*right;
                stack.push(result);
            } else if(tokens[i].equals("/"))
            {
                right = stack.pop();
                left = stack.pop();
                result = left/right;
                stack.push(result);
            }
            else
                stack.push(Integer.parseInt(tokens[i]));
        }
        return stack.pop();
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值