java로 postfix로 나타내고, 계산까지하는 generic stack으로 만든 계산기인데 기대값이 안나옵니다. 어디가 잘못됐을까요 ㅠㅠ제발 부탁드립니다.

조회수 732회

package myfirstjava;

import java.util.ArrayList; import java.util.Scanner; import java.util.StringTokenizer;

class GStack { static int top; Object[] stck;

public GStack() {
    top = 0;
    stck = new Object[200];
}

public T peek() {
    if (top == 0)
        return null;
    else
        return (T) stck[top];
}

public void push(T item) {
    if (top == 200)
        return;
    stck[top] = item;
    top++;
}

public T pop() {
    if (top == 0)
        return null;
    top--;
    return (T) stck[top];
}

}

public class Postfix { private static int PIS(String temp) {

    if (("^").equals(temp))
        return 4;
    if (("*").equals(temp) || ("/").equals(temp))
        return 3;
    if (("+").equals(temp) || ("-").equals(temp))
        return 2;
    if ((")").equals(temp))
        return 1;
    if (("(").equals(temp))
        return 0;
    return 0;
}

private static int PIE(String temp) {
    if (("(").equals(temp))
        return 5;
    if (("^").equals(temp))
        return 4;
    if (("*").equals(temp) || ("/").equals(temp))
        return 3;
    if (("+").equals(temp) || ("-").equals(temp))
        return 2;
    if ((")").equals(temp))
        return 1;
    if (("=").equals(temp) || ("    ").equals(temp))
        return -1;
    return 0;
}

static String IntoPost(StringTokenizer st) {
    GStack<String> stringStack = new GStack<String>();
    int n = st.countTokens();
    ArrayList<String> a = new ArrayList<String>(n);
    for (int i = 0; i < n; i++) {
        String token = st.nextToken();
        try {
            Double.parseDouble(token);
            a.add(token);
            System.out.print(token + " ");

        } catch (NumberFormatException e) {
        }

        switch (token) {
        case ")":
            while (!("(").equals(stringStack)) {
                a.add(stringStack.peek());

                System.out.print(stringStack.pop() + " ");
            }
            stringStack.pop();
            break;

        case "+":
        case "*":
        case "-":
        case "/":
        case "(":
            if (PIS(stringStack.peek()) >= (PIE(token))) {
                while (stringStack.top != 0) {
                    a.add(stringStack.peek());

                    System.out.print(stringStack.pop() + " ");
                }
            }
            stringStack.push(token);
            break;

        case "=":
            while (stringStack.top != 0) {
                a.add(stringStack.peek());
                System.out.print(stringStack.pop() + " ");
            }
        }
    }

    String Postfix = String.join("    ", a);
    return Postfix;
}

static double Evaluation(String s) {
    GStack<Double> DoubleStack = new GStack<Double>();
    StringTokenizer st = new StringTokenizer(s, " ");
    int n = st.countTokens();
    double temp = 0;
    double op1, op2;
    for (int i = 0; i < n; i++) {
        String token = st.nextToken();
        if ((token.equals("+") == false) && (token.equals("-") == false) && (token.equals("*") == false)
                && (token.equals("/") == false)) {
            try {
                temp = Double.parseDouble(token);
                DoubleStack.push(temp);
            } catch (NumberFormatException e) {

            }
        } else {
            op2 = DoubleStack.pop();
            op1 = DoubleStack.pop();

            switch (token) {
            case "+":
                DoubleStack.push(op1 + op2);
                break;
            case "-":
                DoubleStack.push(op1 - op2);
                break;
            case "*":
                DoubleStack.push(op1 * op2);
                break;
            case "/":
                DoubleStack.push(op1 / op2);
                break;
            }
        }
    }
    return temp;
}

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    System.out.print("수식: ");
    String Postfix = in.nextLine();
    StringTokenizer st = new StringTokenizer(Postfix, "+ *(    /-)^=", true);
    String postFix = IntoPost(st);
    double result = Evaluation(postFix);
    System.out.print("    답 : " + result);
    in.close();
}

}

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 2+3*4 = 하면 234*+ 나오고 답:14 이렇게 나와야하는데 오류도 없는데 안나옵니다. 뭐가 잘못됐는지 못찾겠습니다...ㅠㅠ 알 수 없는 사용자 2018.11.20 16:12
  • 디버깅 하는 방법을 학습하세요. 프로그래밍이라는 것이 한번에 결과가 나오는 경우는 드물어요. 오류 찾고 수정 그리고 컴파일 및 실행 이것의 반복이 개발자의 기본업무입니다. 어렵지 않으니 도전해보세요. http://mainia.tistory.com/2259 정영훈 2018.11.20 18:46

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

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

(ಠ_ಠ)
(ಠ‿ಠ)