자바 후위계산식 질문

조회수 423회

package StackCalculator; import java.util.*;

class Converters {

String expr;
String result="";
ArrayList<String> sort = new ArrayList<String>();
ArrayList<String> pfA = new ArrayList<String>();   //postfix ArrayList
Stack ops = new Stack();

//exprConvert
public String converter(String expr){
    //변환할 수식을 잘라서 배열에 넣는다
    StringTokenizer st= new StringTokenizer(expr,"+-*/", true);
    while(st.hasMoreTokens()) {
        String str=st.nextToken();
        str=str.trim();
        sort.add(str);
    }
    String[] before= new String[sort.size()];
    before= (String[])sort.toArray(before);
    //반복문 start
    for(int i = 0; i<before.length; i++){
        //값이 숫자일 경우 리스트에 추가
        if(stLevel(before[i])==-1){
            pfA.add(before[i]);
        }
        //연산자일 경우
        //스택 최상위 연산자보다 먼저 연산해야 하는 연산자일 경우, 스택에 그대로 추가
        else if(isPushToStack(stLevel(before[i]))){
            ops.push(before[i]);
        }
        //스택 최상위 연산자보다 늦게 연산해야 하는 연산자 경우, 최상위 스택의 연산자를 리스트에 추가하고 그자리에 현재 연산자를 추가
        else{
            pfA.add(ops.pop().toString());
            ops.push(before[i]);
        }
    }
    // " "를 제외한스택에 남아있는 모든 연산자를 리스트에 추가
    while(!ops.isEmpty()){
        if(!ops.peek().equals(" ")) {
            pfA.add(ops.pop().toString());
        }
        else
            ops.pop();
    }
    //리스트의 값들을 꺼내어 리턴값 생성
    for(int j = 0; j<pfA.size(); j++){
        result += pfA.get(j);
    }
    return result;

}

private String[] add(String str) {
    return null;
}
//연산자의 레벨. 먼저 계산해야 하는 연산자일수록 높은 레벨. 숫자는 -1. 
public int stLevel(String st){
    switch (st){
    case"*":case"/":return 5;
    case"+":case"-":return 3;
    default: return -1;
    }
}
//레벨이 높으면 스택상위로 추가
public boolean isPushToStack(int level){
    if(ops.isEmpty()){
        return true;
    }
    if(stLevel(ops.peek().toString())<=level){
        return true;
    }
    return false;
}

}

package StackCalculator;

import java.util.ArrayList; import java.util.Stack;

public class Calculator {

public double calculator(String expr) {

    String[] st = expr.split("");
    Stack sa = new Stack();

    double result = 0;
    double temp1 = 0;
    double temp2 = 0;

    for (int i = 0; i < st.length; i++) {
        switch (st[i]) {
        case "+":
            temp1 = Double.parseDouble(sa.pop().toString());
            temp2 = Double.parseDouble(sa.pop().toString());
            result = temp2 + temp1;
            sa.push(result);
            break;

        case "-":
            temp1 =Double.parseDouble(sa.pop().toString());
            temp2 =Double.parseDouble(sa.pop().toString());
            result = temp2 - temp1;
            sa.push(result);
            break;

        case "*":
            temp1 =Double.parseDouble(sa.pop().toString());
            temp2 = Double.parseDouble(sa.pop().toString());
            result = temp2 * temp1;
            sa.push(result);
            break;

        case "/":
            temp1 = Double.parseDouble(sa.pop().toString());;
            temp2 = Double.parseDouble(sa.pop().toString());
            result = temp2 / temp1;
            sa.push(result);
            break;

        default:
            sa.push(st[i]);

        }
    }
    return result;
}

}

package StackCalculator;

import java.util.*;

public class Tester {

public static void main(String[] args) {
    Converters con = new Converters();
    Calculator ca = new Calculator();
    Scanner sc= new Scanner(System.in);
    System.out.print("타겟 :");
    String expr=sc.nextLine();
    System.out.println("결과 : "+ con.converter(expr));
    System.out.println("계산결과: "+ca.calculator(con.converter(expr)));

}

}

<질문>

중위계산표기를 후위계산표기로 바꾸는건 했지만 후위계산식을 실행하니까 계산결과가 안나와요ㅜㅜ 도와주세요!!

타겟 :2+4*5

결과 : 245*+

계산결과: 34.0

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)