java stack generic(으)로 postfix 계산기 만들기 어디서 오류가 나는지 모르겠습니다.

조회수 1480회
package myfirstjava;

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

class GStack<T> {
    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();
    }
}

1 답변

  • 일단 글 수정 요청 승인해주시구요, 돌려보니 딱히 오류(exception)가 나는건 없는데요?

    수식: 2*2

    2 2 답 : 2.0

    기대값이 나오진 않지만요.

    입력값이 무엇일 때 어떤 오류가 나는지를 알려주세요.

    • 제가 원하는 것은 2*2 하면 22* 나오고 답:4 이렇게 나와야하는데, 오류가 없는 것 같은데 기대값이 나오지가 않네요 ㅠ 알 수 없는 사용자 2018.11.20 12:28
    • 답변 채택 말고 글 수정 요청을 승인해주세요 ㅜㅜ 위에 화면 올려보시면 우측에 '승인 대기중 18.11.20'이란 버튼이 있습니다. 편집요청빌런 2018.11.20 14:04
    • 위에 승인 대기중이라는 버튼이 없습니다. ㅠㅠ 혹시 화면 캡처 가능하신가요? ㅠㅠ 컴맹처럼 죄송합니다. 알 수 없는 사용자 2018.11.20 14:55
    • 여전히 기대값이 나오지가 않네요 어느 코드부분이 잘못 되었는지....ㅠ 알 수 없는 사용자 2018.11.20 14:58
    • 제가 글 수정을 요청한거는요. 문제를 고친 코드를 달아드린게 아니라 다른 답변자들 보기 수월하라고 질문만 수정한거에요. 일단 답변 채택 취소하시고 기다리면 누군가 도와주실지도... 대충 봤는데 IntoPost 메서드 쪽에서 잘못된거 아닐까요? 연산자를 Evaluation에 전달하는 과정이 없는걸로 보여요. 편집요청빌런 2018.11.20 15:15

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

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

(ಠ_ಠ)
(ಠ‿ಠ)