逆波兰表达式求值
23 45 2 * 8 2 + - +
- 从左至右,遇到数值将数值依次压入栈中
- 遇到符号弹出栈中两个元素,进行运算,再把结果压入栈中
1、23 45 2 压入栈中
2、弹出2、45,计算45*2=90,将90压入栈
3、依次把8、2 压入栈
4、弹出2、8计算8+2=10,将 10压栈
5、弹出10、90计算90-10=80,将80压入栈
6、弹出80、23计算23+80=103,将103压入栈
7、提取栈顶103,103为最后的结果
C++代码实现
int evalRPN(vector<string>& tokens) {
stack<int> sta;
for (auto i : tokens)
{
if (i == "/" )
{
int sum1 = sta.top(); sta.pop();
int sum2 = sta.top(); sta.pop();
sta.push(sum2 / sum1);
}
else if (i == "*")
{
int sum1 = sta.top(); sta.pop();
int sum2 = sta.top(); sta.pop();
sta.push(sum2 * sum1);
}
else if (i == "+")
{
int sum1 = sta.top(); sta.pop();
int sum2 = sta.top(); sta.pop();
sta.push(sum2 + sum1);
}
else if (i == "-")
{
int sum1 = sta.top(); sta.pop();
int sum2 = sta.top(); sta.pop();
sta.push(sum2 - sum1);
}
else
{
int num = std::stoi(i);
sta.push(num);
}
}
return sta.top();
}
int main()
{
vector<string> vec0{ "2", "1", "+", "3", "*" };
vector<string> vec1{ "4", "13", "5", "/", "+" };
vector<string> vec2{ "10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+" };
cout << evalRPN(vec0) << endl;
cout << evalRPN(vec1) << endl;
cout << evalRPN(vec2) << endl;
return 0;
}
相关例题:Leetcode逆波兰表达式求值 测试用例
输入: ["2", "1", "+", "3", "*"]
输出: 9
解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
输入: ["4", "13", "5", "/", "+"]
输出: 6
解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
输出: 22