leetcode-150. 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
- Subscribe to see which companies asked this question.
思路分析
- 思路:由于逆波兰表达式本身不需要括号来限制哪个运算该先进行,因此可以直接利用栈来模拟计算:遇到操作数直接压栈,碰到操作符直接取栈顶的2个操作数进行计算(注意第一次取出来的是右操作数),然后再把计算结果压栈,如此循环下去。最后栈中剩下的唯一一个元素便是整个表达式的值
- 注意除法的除零保护
AC代码:
class Solution {
public:
int evalRPN(vector<string> &tokens) {
int ret=0;
stack<int> s; //将tokens往里面丢
int L=0,R=0; //左右操作树
for(int i=0;i<tokens.size();i++)
{
if(tokens[i]=="+")
{
R=s.top(); //先是右操作数
s.pop();
L=s.top();
s.pop();
ret=L+R;
s.push(ret);
}else if(tokens[i]=="-")
{
R=s.top();
s.pop();
L=s.top();
s.pop();
ret=L-R;
s.push(ret);
}else if(tokens[i]=="*")
{
R=s.top();
s.pop();
L=s.top();
s.pop();
ret=L*R;
s.push(ret);
}else if(tokens[i]=="/")
{
R=s.top();
s.pop();
L=s.top();
s.pop();
if(R!=0)
ret=L/R;
else
return -1;
s.push(ret);
}else
{
s.push(atoi(tokens[i].c_str()));
}
}//end for
return s.top();
}
};
#include<iostream>
#include<math.h>
#include <vector>
#include<string>
#include<deque>
#include <stack>
#include <queue>
#include<map>
#include <set>
using namespace std;
//evluate reverse polish notation
class Solution {
public:
int str2digit(string str)
{
int ret = 0;
const char *src = str.c_str();
ret = atoi(src);
//for (int i = 0; i < str.size();i++)
//{
// if ()
// {
// }
//}
}
string digit2str(int data)
{
string ret;
char temp[128] = " ";
sprintf_s(temp, "%d", data); //./solution.h:25:3: error: use of undeclared identifier 'sprintf_s'
ret = temp;
return ret;
}
int evalRPN(vector<string> &tokens) {
stack<string> sta;
int oper1, oper2,oper3;
for (unsigned int i = 0; i < tokens.size();i++)
{
if (tokens[i] == "+")
{
oper2 = str2digit(sta.top());
sta.pop();
oper1 = str2digit(sta.top());
sta.pop();
oper3 = oper1 + oper2;
sta.push(digit2str(oper3));
}else if (tokens[i]=="-")
{
oper2 = str2digit(sta.top());
sta.pop();
oper1 = str2digit(sta.top());
sta.pop();
oper3 = oper1 - oper2;
sta.push(digit2str(oper3));
}
else if (tokens[i]=="*")
{
oper2 = str2digit(sta.top());
sta.pop();
oper1 = str2digit(sta.top());
sta.pop();
oper3 = oper1 * oper2;
sta.push(digit2str(oper3));
}
else if (tokens[i]=="/")
{
oper2 = str2digit(sta.top());
sta.pop();
oper1 = str2digit(sta.top());
sta.pop();
oper3 = oper1 / oper2; //除零保护
sta.push(digit2str(oper3));
}
else
{
sta.push(tokens[i]);
}
}
return str2digit(sta.top());
}
};
int main()
{
return 0;
}
reference
C/C++基本语法学习
STL
C++ primer
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· 博客园 & 1Panel 联合终身会员上线
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· https证书一键自动续期,帮你解放90天限制
· 在 ASP.NET Core WebAPI如何实现版本控制?
· 告别虚拟机!WSL2安装配置教程!!!