2016-06-25 9 views
-4

私は、テキストファイルから文字列をインポートし、その文字列をスタックを使って分析し、特定の規則に適合しているかどうかに基づいて文字列がどの "言語"に属するかを判断するコードを書いています。以下のコードは、入力がパターン(A^nB ^)^ p(nは0以上)に続くかどうかを調べるためのテストです。私が書いたのは、AとBの最初のセットをスタックにロードし、次にAとBの2番目のセットを別のスタックにロードし、2つのスタックを同時にポップして戻り値を比較することです。一致した場合は、2つのスタックが同時に空になるまで(うまくいけば)、次にfalseを返すようにしてください。falseを返す必要がある場合にコードが真を返すのはなぜですか?

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を返す必要がありますいくつかのケースでは、それはtrueを返します。それで、回文であるケースや、非Aと非Bの文字があるケースでは、なぜそれが真に戻ってくるのですか?私は、w(入力)がAではなく、Bでなければfalseを返すというステートメントがそこにあることを知っています。これは私が書いた同様の方法で働いています。なぜこれはどうですか?また、2つの返された値が一致しない場合(入力が回文であれば)、falseを返すようにこれを書いています。

+0

を使用して2つの文字列の間で比較すること.isEqualを使うべきだと思います。 – Andreas

答えて

0

私はあなたの代わりにあなたが*生*汎用オブジェクトを使用するので、 `スタック `に `Stack`を変更しないでください==

+0

私のお詫びは、私は文字列(テキストファイルからの文字列全体を参照して)質問に文字列を言うが、実際にはchar値に分解されています。 – Jes

関連する問題