gpt4 book ai didi

c++ - 清理 LeetCode Evaluate Reverse Polish Notation 的代码

转载 作者:行者123 更新时间:2023-11-30 02:32:35 30 4
gpt4 key购买 nike

LeetCode OJ题Evaluate Reverse Polish Notation我写了如下代码

int evalRPN(vector<string>& tokens) 
{
int n = tokens.size();
if (n == 0)
return 0;
stack<int> S;
int a, b;
for (int i = 0; i < n; i++)
{
string tmp = tokens[i];
if (tmp == "+")
{
a = S.top(); S.pop();
b = S.top(); S.pop();
S.push(b + a);
}
else if (tmp == "-")
{
a = S.top(); S.pop();
b = S.top(); S.pop();
S.push(b - a);
}
else if (tmp == "*")
{
a = S.top(); S.pop();
b = S.top(); S.pop();
S.push(b * a);
}
else if (tmp == "/")
{
a = S.top(); S.pop();
b = S.top(); S.pop();
S.push(b / a);
}
else
{
S.push(stoi(tmp));
}
}
return S.top();
}

代码无疑是正确的。但是,我觉得部分代码并不干净。其实我想这样写代码:

int evalRPN(vector<string>& tokens) 
{
int n = tokens.size();
if (n == 0)
return 0;
stack<int> S;
int a, b;
for (int i = 0; i < n; i++)
{
string tmp = tokens[i];
if (tmp is any of "+", "-", "*", "/") // <== [1]
{
a = S.top(); S.pop();
b = S.top(); S.pop();
S.push(compute(a, b, tmp)); // <== [2]
}
else
{
S.push(stoi(tmp));
}
}
return S.top();
}
  1. [1]中,我不想写tmp == "+"|| tmp == "-"|| tmp == "*"|| tmp == "/",我想要更清晰的代码来检查 tmp 是四个运算符中的任何一个;
  2. [2]中,函数compute(int a, int b, string& tmp)将输出操作数a的结果, b 和运算符 tmp。但我仍然不想使用任何 if - else (switch 可能被接受,但我不知道如何在这里使用 string)。欢迎使用 Lambda 函数或任何可能的运算符函数(如果存在)。

有什么方法可以做到吗?

最佳答案

这应该适用于 C++11 或更高版本。 (如果使用带有 -std=c++11 标志的 g++ 编译)。

#include <map>
#include <functional>
// ...

int evalRPN(vector<string>& tokens)
{
// map of string -> lambda
std::map<std::string, std::function<int(int,int)>> ops;

// fill the map
ops["+"] = [](int a,int b) { return b+a; };
ops["-"] = [](int a,int b) { return b-a; };
ops["*"] = [](int a,int b) { return b*a; };
ops["/"] = [](int a,int b) { return b/a; };

int n = tokens.size();
if (n == 0)
return 0;

stack<int> S;
int a, b;
for (int i = 0; i < n; i++)
{
string tmp = tokens[i];
// find the operator in map
auto opit = ops.find(tmp);
if ( opit != ops.end() ) {
// if token is in map (ie. if it is operator)
a = S.top(); S.pop();
b = S.top(); S.pop();
// get the function
auto fn = opit->second;
// and push it's result to stack
S.push( fn(a,b) );
} else {
// if not operator push to stack
S.push(stoi(tmp));
}

}
return S.top();
}

关于c++ - 清理 LeetCode Evaluate Reverse Polish Notation 的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36228717/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com