본문 바로가기

풀어본 Algorithm 문제 정리

[OJ.leetcode] Evaluate Reverse Polish Notation

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;

    }

};