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
Вычислите значение
арифметического выражения, заданного в обратной польской записи.
Возможные операторы: +, -,
*, /. Каждый операнд представляет собой число или другое арифметическое выражение.
Примеры:
["2",
"1", "+", "3", "*"] -> ((2 + 1) * 3)
-> 9
["4",
"13", "5", "/", "+"] -> (4 + (13 /
5)) -> 6
// C++
class Solution {
public:
int evalRPN(vector<string>& tokens) {
}
};
// Java
public class
Solution {
public int
evalRPN(String[] tokens) {
}
структуры данных - стек
Обрабатываем последовательно токены. Объявим стек, который в начале работы
пустой.
·
Если токен
является числом, то занесем его в стек.
·
Если токен –
арифметическая операция, то извлечем из стека два последних числа, выполним над
ними операцию и занесем в стек результат.
После окончания обработки всех токенов на вершине стека находится
результат.
Реализация алгоритма
class Solution
{
public:
int evalRPN(vector<string>& tokens)
{
stack<int> s;
if (tokens.size() == 0) return
0;
string op = "+-*/";
for(int i = 0; i <
tokens.size(); i++)
{
string tok =
tokens[i];
int o = op.find(tok);
if (o == -1)
s.push(atoi(tok.c_str()));
else
{
int a = s.top(); s.pop();
int b = s.top(); s.pop();
if (o == 0) s.push(b+a);
if (o == 1) s.push(b-a);
if (o == 2) s.push(b*a);
if (o == 3) s.push(b/a);
}
}
return s.top();
}
};
Java реализация
class Solution
{
public int
evalRPN(String[] tokens)
{
if (tokens.length == 0) return
0;
Stack<Integer> s = new
Stack<Integer>();
String operators = "+-*/";
for(int i = 0; i <
tokens.length; i++)
{
String tok =
tokens[i];
if (!operators.contains(tok))
s.push(Integer.valueOf(tok));
else
{
int a = s.peek(); s.pop();
int b = s.peek(); s.pop();
if (tok.equals("+"))
s.push(b+a);
if
(tok.equals("-")) s.push(b-a);
if (tok.equals("*"))
s.push(b*a);
if (tok.equals("/"))
s.push(b/a);
}
}
return s.peek();
}
}