leetcode oj

150. 逆波兰表达式求值 - 力扣(LeetCode)

思路:定义一个名为 Solution 的类,并在其中定义了一个名为 evalRPN 的公共函数。这个函数接受一个由字符串组成的向量 tokens 作为输入,并返回一个整数。

在代码中,首先定义了一个栈 st,用于存储运算过程中的中间结果。

接下来,代码使用一个 for 循环遍历 tokens 中的每个字符串。在循环中,首先判断字符串是否为运算符(+、-、*、/),如果是,则进行相应的运算。具体来说,先将栈顶的两个数 pop 出来,然后根据运算符进行加、减、乘、除等运算,并将结果 push 回栈中。

如果遇到的字符串不是运算符,则直接将其转换为整数,并 push 入栈中。

最后,代码返回栈顶的数值,即最终的计算结果。

如果用这个代码就是测试用列就通不过:

cpp 复制代码
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
stack<int> st;

for(auto str:tokens)
{
   if( str=="+"
        ||str=="-"
        ||str=="*"
        ||str=="/"
      )
{
    int left=st.top();
    st.pop();
    int right=st.top();
    st.pop();



switch(str[0])
{
    case '+':
st.push(left+right);
break;
case '-':
st.push(left-right);
break;
case '*':
st.push(left*right);
break;
case '/':
st.push(left/right);
break;
}
}
else
{
       st.push(stoi(str));
}
}
return st.top();
    }
};

这个代码就过了:

cpp 复制代码
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
stack<int> st;

for(auto str:tokens)
{
if(str=="+"||
   str=="-"||
   str=="*"||
   str=="/"
)    
{
    int left=st.top();
    st.pop();
    int right=st.top();
    st.pop();



switch(str[0])
{
    case '+':
st.push(left+right);
break;
case '-':
st.push(left-right);
break;
case '*':
st.push(left*right);
break;
case '/':
st.push(left/right);
break;
}
}
else
{
       st.push(stoi(str));
}
}
return st.top();
    }
};


class Solution {
public:
    int evalRPN(vector<string>& tokens) {


stack<int>  st;


for(auto str:tokens)
{
    if( str=="+"
        ||str=="-"
        ||str=="*"
        ||str=="/"
      )
         {
             int right=st.top();
             st.pop();
             int left=st.top();
             st.pop();
             switch(str[0])
             {
                  case '+':
                  st.push(left+right);
                  break;
                  case '-':
                  st.push(left-right);
                  break;
                  case '*':
                  st.push(left*right);
                  break;
                  case '/':
                  st.push(left/right);
                  break;
             }
         }
         else
         {
             st.push(stoi(str));
         }

}
return st.top();
    }
};

两段代码的区别:

cpp 复制代码
   

    int left=st.top();
    st.pop();
    int right=st.top();
    st.pop();



 int right=st.top();
    st.pop();
    int left=st.top();
    st.pop();

我刚开始以为left right就是两个变量,随便哪个先定义无所谓,但是下面的运算中有"/",left和right谁先出栈谁就在前面作为被除数,谁作为被输数会影响到结果。

相关推荐
Hello.Reader13 分钟前
算法基础(十)——分治思想把大问题拆成小问题
java·开发语言·算法
逻辑驱动的ken1 小时前
Java高频考点场景题24
java·开发语言·面试·职场和发展·求职招聘
绛橘色的日落(。・∀・)ノ1 小时前
机器学习之评估与偏差方差分析
算法
消失的旧时光-19431 小时前
C语言对象模型系列(四)《Linux 内核里的 container_of 到底是什么黑魔法?》—— 一篇讲透 Linux 内核的“对象模型”核心技巧
linux·c语言·算法
AI_Ming2 小时前
从0开始学AI:层归一化,原来是这回事!
算法·ai编程
WL_Aurora2 小时前
备战蓝桥杯国赛【Day 8】
算法·蓝桥杯
智者知已应修善业2 小时前
【51单片机模拟生日蜡烛】2023-10-10
c++·经验分享·笔记·算法·51单片机
MediaTea2 小时前
Scikit-learn:从数据到结构——无监督学习的最小闭环
人工智能·学习·算法·机器学习·scikit-learn
智者知已应修善业2 小时前
【51单片机如何让LED灯从一亮到八,再从八亮到一】2023-10-13
c++·经验分享·笔记·算法·51单片机
qeen873 小时前
【数据结构】二叉树相关经典函数C语言实现
c语言·数据结构·c++·笔记·学习·算法·二叉树