후위식 연산

minho·2021년 9월 28일
0

문제

나의 코드

function calculation(stack, s, aws){
                let v = stack.pop();
                if(s === "+") aws += v;
                else if(s === "-") aws -= v;
                else if(s === "*") aws *= v;
                else aws /= v;
                return aws;
            }
            function solution(s){                 
                    let answer = 0,
                        stack =[],
                        sta = true;
                    for(let s of str) {                        
                        if(s.charCodeAt(0)>47 && s.charCodeAt(0)<58){
                            stack.push(s*1);
                            sta = true;
                        }else {
                            if(sta === true){
                                for(let i =0; i<stack.length; i++){
                                    if(answer === 0) answer = stack.pop();
                                    else answer = calculation(stack, s, answer);                          
                                }
                                sta = false;
                            }else answer = calculation(stack, s, answer);
                        }
                    console.log("stack:",stack,"answer:",answer);
                    }                
                return answer;
            }
	    let str="352+*9-";
            console.log(solution(str));

원리

  1. 숫자는 stack으로 보내주고, 숫자에서 연산기호로 변경될시 계산해준다.
    1-1. 숫자에서 연산기호로 변경됨을 알기 위해 sta(status) 변수를 이용하여 구분한다.

미흡한점

  • 숫자인지 문자인지 구분하는 방법 아스키 코드 사용
  • 숫자에서 연산기호로 변경을 구현하는과정 복잡

개선방법

숫자에서 연산기호로 변경을 구현하지말고 stack에 계산한 값을 넣어주는 방법

개선한 코드

function solution(s){  
                let answer;
                let stack=[];
                for(let x of s){
                    if(!isNaN(x)) stack.push(Number(x));
                    else{
                        let rt=stack.pop();
                        let lt=stack.pop();
                        if(x==='+') stack.push(lt+rt);
                        else if(x==='-') stack.push(lt-rt);
                        else if(x==='*') stack.push(lt*rt);
                        else if(x==='/') stack.push(lt/rt);
                    }
                }
                answer=stack[0];
                return answer;
            }

            let str="352+*9-";
            console.log(solution(str));

알게된점

  • isNaN(): NaN의 약자는 Not a Number의 약자로 숫자인지 아닌지 판별하게 해준다.
  • 문자를 숫자로 변환하는 방법은 *1을 해주는것 보단 Number()를 사용해주는게 시인성이 좋다.
  • 계산한 결과를 stack에 push하고 투포인터를 이용하여 연산하면 간단한 구현이 가능하다.
profile
Live the way you think

0개의 댓글