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谁先出栈谁就在前面作为被除数,谁作为被输数会影响到结果。

相关推荐
NAGNIP1 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队1 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja1 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下1 天前
最终的信号类
开发语言·c++·算法
茉莉玫瑰花茶1 天前
算法 --- 字符串
算法
博笙困了1 天前
AcWing学习——差分
c++·算法
NAGNIP1 天前
认识 Unsloth 框架:大模型高效微调的利器
算法
NAGNIP1 天前
大模型微调框架之LLaMA Factory
算法
echoarts1 天前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Python技术极客1 天前
一款超好用的 Python 交互式可视化工具,强烈推荐~
算法