题目:
根据逆波兰表示法,求表达式的值。
有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 1:
输入: ["2", "1", "+", "3", "*"]
输出: 9
解释: ((2 + 1) * 3) = 9
示例 2:
输入: ["4", "13", "5", "/", "+"]
输出: 6
解释: (4 + (13 / 5)) = 6
示例 3:
输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
输出: 22
解释:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22
链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation
思路:
1、使用一个列表来存储输入的元素,如果当前元素是数字则将当前元素放入列表。如果当前元素是运算符,则将列表pop出两个元素进行操作符运算并将运算结果放入列表中
Python代码:
class Solution(object):
def evalRPN(self, tokens):
"""
:type tokens: List[str]
:rtype: int
"""
ls = []
for item in tokens:
if (item in ('+','-','*','/')):
second = ls.pop()
first = ls.pop()
if item == '+':
ans = first + second
if item == '-':
ans = first-second
if item == '*':
ans = first * second
if item == '/':
ans = int(first*1.0/second)
ls.append(ans)
else:
ls.append(int(item))
return ls[-1]
C++代码:
#include <math.h>
#include <string>
class Solution {
public:
int evalRPN(vector<string>& tokens) {
vector<int> ls;
for (auto item : tokens){
if (item=="+" || item=="-" || item=="*" || item=="/"){
int second = ls.back();
ls.pop_back();
int first = ls.back();
ls.pop_back();
int ans;
if(item=="+") ans = first+second;
if(item=="-") ans = first-second;
if(item=="*") ans = first*second;
if(item=="/") ans = (int)(first*1.0/second);
ls.push_back(ans);
}else{
ls.push_back(stoi(item));
}
}
return ls.back();
}
};