【代码随想录-Leetcode第四题:150. 逆波兰表达式求值】

题目

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’ 。
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断 。
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。
    测试样例1:
输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

测试样例2:

输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

解题思路

**思路:**遇到数字就进行入栈,遇到符号就取弹出两个元素再操作后再次将计算结果压如栈中,栈中最后就会只剩下一个最终的结果,取栈顶元素也就是所要求的结果了。

注意:

1、由于stl的st.pop()没有返回值,所以可以执行先取栈顶元素后再删除

2、逆波兰后缀表达式从栈顶弹出元素时,先弹出来的作为被减数,也就是右面的数,后弹出来的是前面的数,例如num1是先弹出来的,num3是后弹出来的,则 num2 操作数 num1,前缀表达式相反。

3、题目要求 1 <= tokens.length <= 104,故而 使用long long类型

stoll 此函数将在函数调用中作为参数提供的字符串转换为long long int。它解析str并将其内容解释为指定基数的整数,并将其作为long long int类型的值返回

//


//@i want to 舞动乾坤 2023/08/10
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
      
         stack<long long> st; 
     for(int i=0;i<tokens.size();i++){
         //如果为操作符号
         if(tokens[i]=="+" || tokens[i]=="-" || tokens[i]=="*" || tokens[i]=="/"){
          long long  opera_num1=st.top();//取栈顶第一个操作数
          st.pop();//删除元素
          long long opera_num2=st.top();//取第二个操作数
           st.pop();//删除第二个元素,无返回值
     
              if(tokens[i]=="+") //如果是加号
              st.push(opera_num2+opera_num1);//将操作数计算的结果压入栈中
              if(tokens[i]=="-") //
              st.push(opera_num2-opera_num1);
              if(tokens[i]=="*") //
              st.push(opera_num2*opera_num1);
              if(tokens[i]=="/") //
              st.push(opera_num2/opera_num1);

            
         }else{//如果是数字,就进行入栈
         st.push(stoll(tokens[i]));
         }

     }
     return st.top();//遍历完成后栈中只剩最终的一个结果,取栈顶元素即可。
    }
};

你可能感兴趣的:(leetcode,算法)