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

相关推荐
WHS-_-202242 分钟前
Python 算法题学习笔记一
python·学习·算法
沉鱼.441 小时前
第六届题目
算法
黑眼圈子1 小时前
总结一下用Java做算法的常用类和方法
java·开发语言·算法
apcipot_rain1 小时前
天梯赛练习集 时间规划 限时复盘 中档题详解(L1-6~L2-4)
算法
再卷也是菜1 小时前
第一章、线性代数(2)高斯消元法
线性代数·算法
NAGNIP1 小时前
一文搞懂CNN经典架构-EfficientNet!
算法·面试
如何原谅奋力过但无声1 小时前
【chap11-动态规划(上 - 基础题目&背包问题)】用Python3刷《代码随想录》
数据结构·python·算法·动态规划
小宇的天下2 小时前
Calibre LVS Circuit Comparison(2)
算法·lvs
迈巴赫车主2 小时前
求最大公约数-欧几里得算法(辗转相除法)
算法·最大公约数
测试19983 小时前
Python+Excel读取和存储测试数据完成接口自动化测试
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试