택택
109
2019-07-09 22:17:01
2
927

자바 infix -> postfix 변환 질문!


안녕하세요!

군대에서 자바를 공부를 시작한 군인입니다.

홀로 자바를 공부하다가 예상치 못하게 막힌 부분이 있어 질문 남깁니다.


제가 infix로 "1+2*3" 을 넣으면 1, +, 2, 3은 제가 원하는 대로 조건문을 잘 통과하는데 * 차례에서

Opstack.peek()이 +가 맞기에

 else if((String)Opstack.peek()=="+"||(String)Opstack.peek()=="-")

이 조건문에 참이 되어 들어가야하는데 계속 건너뜁니다...


그래서 따로 메인 함수에서 현재 주석처리한 비슷한 식을 실행하면 또 잘됩니다...

조건문 전에 peek을 했을때 +로 잘 뜨기도 하고요!


혹시 문제를 알려주실 수 있으신가요..!?

감사합니다!


public class Main {
    public static void main(String[] args) throws IOException{
        
        Calculator Cal1 = new Calculator();
        
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        
        System.out.print("계산할 식을 넣으십시오 : ");
        
        String infix = bf.readLine();
        
        System.out.println(Cal1.ConvertInfixToPostfix(infix));

        // Stack a = new Stack();
        // a.push(5);
        // a.push(3);
        // a.push("-");
        // if((String)a.peek()=="-"||(int)a.peek()==7)
        //     System.out.println("잘된당");
    }

}

class Calculator{
    
    public static String ConvertInfixToPostfix(String infix){
        Stack Opstack = new Stack();
        
        String postfix= "";
        String [] Split = infix.split("");
        
        for(String one : Split){
            
            switch (one){
                case "0":
                case "1":
                case "2":
                case "3":
                case "4":
                case "5":
                case "6":
                case "7":
                case "8":
                case "9":
                    postfix += one;
                    break;
                case "+":
                case "-":
                    if(Opstack.isEmpty()){
                        Opstack.push(one);
                        break;
                    }
                    else if((String)Opstack.peek()=="+"||(String)Opstack.peek()=="-"){
                        postfix += Opstack.pop();
                        Opstack.push(one);
                        break;
                    }
                    else if((String)Opstack.peek()=="*"||(String)Opstack.peek()=="/"){
                        while(!Opstack.isEmpty()){
                            if((String)Opstack.peek()=="(")
                                break;
                            postfix +=Opstack.pop();
                        }
                        Opstack.push(one);
                        break;
                    }
                    else
                        break;
                case "*":
                case "/":
                    if(Opstack.isEmpty()){
                        Opstack.push(one);
                        break;
                    }
                    else if((String)Opstack.peek()=="+"||(String)Opstack.peek()=="-"){
                        Opstack.push(one);
                        break;
                    }
                    else if((String)Opstack.peek()=="*"||(String)Opstack.peek()=="/"){
                        postfix+= Opstack.pop();
                        Opstack.push(one);
                        break;
                    }
                    else
                        break;
                case "(":
                    Opstack.push(one);
                    break;
                case ")":
                    while(!Opstack.isEmpty()){
                        if((String)Opstack.peek()=="("){
                            Opstack.pop();
                                break;
                        }
                            postfix += Opstack.pop();
                    }
                    break;
                default:
                    System.out.println("식에 맞지 않는 값이라구요;;;; ");
                    return "에러!!";
            }
            
        }
        while(!Opstack.isEmpty())
                postfix+= Opstack.pop();
        return postfix;
    }
    
}


0
  • 답변 2

  • 멘탈조각
    1k
    2019-07-10 06:47:34 작성 2019-07-10 06:51:26 수정됨

    java string은 Object입니다.

    그리고 자바에서는 ==의 동작이 primitive일때는 value, Object일때는 ref입니다.

    아주 가장 기초적인 자바의 특성입니다.

    도대체 어떤책으로 공부하시는데 이런것도 안써있나요

  • lloydkwon
    2k
    2019-07-10 14:12:24

    중요한게 문자열 비교는 ==가 아닌 .equals  또는 equalsIgnoreCase 로 한다는 겁니다.

    그리고 변수명은 소문자로 시작해야 하는데 Opstack 는 조금 거슬립니다. ㅋ


    일단 Stack에 String 문자열 사용하도록 수정하구요.. 

    Stack<String> Opstack = new Stack();


    아래처럼 문자열 비교를 아래처럼 변경시켜 보세요.

    (String)Opstack.peek()=="+"

    ==>

    "+".equalsIgnoreCase(Opstack.peek()) 


    모두 바꾸어 보니 잘 처리합니다.

    1+2*3 ==> 123*+



    참고로 아래에 변경한 코드도 올립니다.


    public static String ConvertInfixToPostfix(String infix){
            Stack<String> Opstack = new Stack();
    
            String postfix= "";
            String [] Split = infix.split("");
    
            for(String one : Split){
    
                switch (one){
                    case "0":
                    case "1":
                    case "2":
                    case "3":
                    case "4":
                    case "5":
                    case "6":
                    case "7":
                    case "8":
                    case "9":
                        postfix += one;
                        break;
                    case "+":
                    case "-":
                        if(Opstack.isEmpty()){
                            Opstack.push(one);
                            break;
                        }
                        else if("+".equalsIgnoreCase(Opstack.peek())  || "-".equalsIgnoreCase(Opstack.peek())){
                            postfix += Opstack.pop();
                            Opstack.push(one);
                            break;
                        }
                        else if("*".equalsIgnoreCase(Opstack.peek())|| "/".equalsIgnoreCase(Opstack.peek())){
                            while(!Opstack.isEmpty()){
                                if ("(".equalsIgnoreCase(Opstack.peek())) {
                                    break;
                                }
                                postfix +=Opstack.pop();
                            }
                            Opstack.push(one);
                            break;
                        }
                        else
                            break;
                    case "*":
                    case "/":
                        if(Opstack.isEmpty()){
                            Opstack.push(one);
                            break;
                        }
                        else if("+".equalsIgnoreCase(Opstack.peek())  || "-".equalsIgnoreCase(Opstack.peek())){
                            Opstack.push(one);
                            break;
                        }
                        else if("*".equalsIgnoreCase(Opstack.peek())|| "/".equalsIgnoreCase(Opstack.peek())){
                            postfix+= Opstack.pop();
                            Opstack.push(one);
                            break;
                        }
                        else
                            break;
                    case "(":
                        Opstack.push(one);
                        break;
                    case ")":
                        while(!Opstack.isEmpty()){
                            if("(".equalsIgnoreCase(Opstack.peek())){
                                Opstack.pop();
                                break;
                            }
                            postfix += Opstack.pop();
                        }
                        break;
                    default:
                        System.out.println("식에 맞지 않는 값이라구요;;;; ");
                        return "에러!!";
                }
    
            }
            while(!Opstack.isEmpty())
                postfix+= Opstack.pop();
            return postfix;
        }




  • 로그인을 하시면 답변을 등록할 수 있습니다.