2016-06-25 5 views
-4

텍스트 파일에서 문자열을 가져오고 스택을 사용하여 문자열을 분석하고 특정 규칙에 적합한 지 여부에 따라 문자열이 속한 "언어"를 결정하는 코드를 작성하고 있습니다. 아래 코드는 입력이 패턴 (A^nB ^)^p (여기서 n은 0보다 크거나 같음)를 따르는 지 여부를 테스트합니다. 필자가 작성한 방법은 A와 B의 첫 번째 세트를 스택에로드 한 다음 두 번째 세트의 A와 B를 다른 스택에로드하고 두 개의 스택을 동시에 팝하고 반환 된 값을 비교하는 것입니다. 일치하는 경우, 두 스택이 동시에 비어있을 때까지 이동하고, 그렇지 않으면 false를 반환합니다.false를 반환해야하는 경우 내 코드가 true를 반환하는 이유는 무엇입니까?

public static boolean checkL4(File file) throws IOException 
{ 
    Stack stack1 = new Stack(); 
    Stack stack2 = new Stack(); 
    Stack stack3 = new Stack(); 
    boolean firstCompare = true; 
    boolean bStart = false; 
    char w = 0; 

    try (Scanner sc = new Scanner(file).useDelimiter("\\s*")) 
    { 
     while (sc.hasNext()){ 
      w = sc.next().charAt(0); 
      if (w == 0) { 
       return true; 
      } 
      if (w != 'A' && w != 'B') 
      { 
       return false; 
      } 
      if (w == 'A') { 
       if(!bStart) { 
        stack1.push(w); 
        stack3.push(w); 
       } 
       if(bStart && stack2.isEmpty()) { 
        stack2.push(w); 
       } else { 
        if (firstCompare) { 
        while (!stack1.isEmpty() || !stack2.isEmpty()) { 
         if (!stack1.isEmpty() && stack2.isEmpty()) 
         { 
          return true; 
         } 
         if (stack1.isEmpty() && !stack2.isEmpty()) { 
          return false; 
         } else { 
          if (stack1.pop() == stack2.pop()) { 
           return true; 
          } else { 
           return false; 
          } 
         } 
        } 
        stack1.push(w); 
        firstCompare = false; 
       } else { 
        if(stack1.isEmpty()){ 
         while (!stack3.isEmpty() || !stack2.isEmpty()) { 
          if (stack3.isEmpty() && !stack2.isEmpty()) { 
           return false; 
          } else { 
           if (stack2.isEmpty() && !stack3.isEmpty()) { 
            return false; 
           } else { 
            if (stack3.pop() == stack2.pop()) { 
             return true; 
            } else { 
             return false; 
            } 
           } 
          } 
         } 
         stack1.push(w); 
        } 
        if (stack3.isEmpty()){ 
         while (!stack1.isEmpty() || !stack2.isEmpty()) { 
          if (stack1.isEmpty() && !stack2.isEmpty()) { 
           return false; 
          } else { 
           if (stack2.isEmpty() && !stack1.isEmpty()) { 
            return false; 
           } else { 
            if (stack1.pop() == stack2.pop()) { 
             return true; 
            } else { 
             return false; 
            } 
           } 
          } 
         } 
         stack1.push(w); 
        } 
        } 
       } 
      } 
      if (w == 'B') { 
       bStart = true; 

       if(bStart && stack2.isEmpty()) { 
        stack2.push(w); 
       } 
       if(bStart && !stack2.isEmpty()) { 
        if (!stack1.isEmpty()) { 
         stack3.push(w); 
        } 
        if(!stack3.isEmpty()) { 
         stack1.push(w); 
        } 
       } 
      } 
     } 
    } 
    return false; 
} 

이 코드는 대부분의 입력이 사실 반환 (AB 및 AABBBAABBB true를 반환하고, BBAA에 대한 false를 반환)하지만 어떤 경우에는 곳은 (ABBA 및 AABBCCD 같은) false를 반환해야 제대로 작동합니다. 따라서 회문문 인 경우와 그렇지 않은 경우가있는 이유는 무엇입니까? 나는 w (입력)가 아니고 A가 아니고 B가 아닌 경우 false를 반환한다고하는 진술을 거기에 가지고 있습니다. 이것은 필자가 작성한 유사한 방법들에서 효과가있다. 두 반환 된 값이 일치하지 않으면 false를 반환하기 위해이 메서드를 작성했습니다 (입력이 회귀 식이면 안됩니다).

+0

를 사용하여 두 개의 문자열 사이의 비교, 그래서'스택 '에'Stack'을 변경 .isEqual를 사용한다고 생각합니다. – Andreas

답변

0

난 당신 대신 당신은 * 원 * 일반 객체를 사용하지 말아야 ==

+0

내 사과, 나는 (텍스트 파일에서 전체 문자열을 참조) 질문에 문자열을 말하지만 실제로 char 값으로 세분화됩니다. – Jes

관련 문제