【发布时间】:2016-07-13 17:27:45
【问题描述】:
我已经为 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],我不想写tmp == "+" || tmp == "-" || tmp == "*" || tmp == "/",我想要更简洁的代码来检查tmp是四个运算符中的任何一个; - 在
[2]中,函数compute(int a, int b, string& tmp)将输出操作数a、b和运算符tmp的结果。但是我仍然不想使用任何if - else(switch可能会被接受,但我不知道如何在此处使用string)。欢迎使用 Lambda 函数或任何可能的运算符函数(如果存在)。
有没有办法做到这一点?
【问题讨论】:
-
SQL 等一些语言有关键字
in,它可以让你做你在 1 中要求的事情,但是我很确定在 C++ 中没有类似的东西。 -
我讨厌写很多条件语句
-
可以将数组传递给方法,然后循环遍历数组。
-
不喜欢 switch 语句?
-
是的。给我看代码
标签: c++