https://oj.leetcode.com/problems/evaluate-reverse-polish-notation/
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
/*
사칙연산의 우선순위가 존재하는데, 주어진 예제에서 입력이 언제나 사칙연산의 우선순위에 맞게 들어오므로
연산기호가 들어올경우, 바로앞 두개의 수를 연산하고 다시 그다음 입력으로 활용한다는 것만 알면 됨.
따라서 사칙연산의 순서= 후입선출=stack을 사용한다는 것만 눈치 채면 간단히 해결.
c++의 string<->int 변환 잘 알아두기
*/
class Solution {
public:
int evalRPN(vector<string> &tokens) {
stack<string> input;
for(int i=0; i<tokens.size() ; i++) {
if(isOperator(tokens[i]) == true) {
if(tokens[i] == "+") {
int second = atoi(input.top().c_str());
input.pop();
int first = atoi(input.top().c_str());
input.pop();
input.push(to_string(first+second));
} else if(tokens[i] == "-") {
int second = atoi(input.top().c_str());
input.pop();
int first = atoi(input.top().c_str());
input.pop();
input.push(to_string(first-second));
} else if(tokens[i] == "*") {
int second = atoi(input.top().c_str());
input.pop();
int first = atoi(input.top().c_str());
input.pop();
input.push(to_string(first*second));
} else if(tokens[i] == "/") {
int second = atoi(input.top().c_str());
input.pop();
int first = atoi(input.top().c_str());
input.pop();
input.push(to_string(first/second)); //if first is zero : need exception case
}
} else {
input.push(tokens[i]);
}
}
return atoi(input.top().c_str());
}
bool isOperator(string token) {
if(token == "+" || token == "-" || token == "*" || token == "/" ) return true;
else return false;
}
};
'풀어본 Algorithm 문제 정리' 카테고리의 다른 글
[OJ.leetcode] Validate Binary Search Tree (0) | 2014.06.29 |
---|---|
[OJ.leetcode] Convert Sorted Array to Binary Search Tree (0) | 2014.06.29 |
[OJ.leetcode] Search Insert Position (0) | 2014.06.29 |
[OJ.leetcode] Valid Palindrome (0) | 2014.06.29 |
[OJ.leetcode] Linked List Cycle (0) | 2014.06.29 |