2017-02-16 8 views
0

私はhw用のプログラムを書いています。これらの記号のバランスをとるために、 l { }'s, ()'s, [ ]'s, " "'s, and /* */'sとし、文字列リテラルとコメントブロックは無視しますが、その方法はわかりません。私のコードは部分的に動作していますが、それは{ }になるとわかりません。また、/* */を扱う際の問題もあります。私は立ち往生し、どの方向へ行くのか分からない。例えばシンボルのバランスをとるプログラムの作成方法は?

、与えられた:

public class Test { 
    public static final void main(String[) args) { 
     System.out.println("Hello."); 
    } 
} 

{}直前ではありませんので、それは2 }不一致を出力します。シンボルをスタックにプッシュして比較するためにポップする必要があります。

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 


public class SymbolBalance { 

    public static void main(String[] args){ 
      if(args.length>0){ 
       try{ 
        Scanner input = new Scanner(new File (args[0])); 
        MyStack<Character> ms = new MyStack<>(); 
        String str; 
        char ch; 
        while(input.hasNext()){ 
         str = input.next(); 
         for(int i=0;i<str.length();i++){ 
          ch = str.charAt(i); 
          if(ch == '{'||ch =='(' || ch=='[' ||ch=='"'|| 
            (ch == '/'&&i<str.length() -1&&str.charAt(i+1)=='*')) 
          { 
           ms.push(ch); 
          } 
          else if (ch==')'){ 
           if(ms.isEmpty()||ms.pop()!= '('){ 
            System.out.println(") is mismatched"); 
           } 
          } 
          else if(ch == ']'){ 
          if(ms.isEmpty() || ms.pop() != '['){ 
           System.out.println("] is mismatched"); 
          } 
         } 
          else if(ch == '}'){ 
          if(ms.isEmpty() || ms.pop() != '{'){ 
           System.out.println("} is mismatched"); 
          } 
         } 
          else if(ch == '*' && i<str.length()-1&&str.charAt(i+1) == '/'){ 
          if(ms.isEmpty() || ms.pop() != '*'){ 
           System.out.println("*/ is mismatched"); 
          } 
         } 
          else if(ch == '"'){ 
          if(ms.isEmpty() || ms.pop() != '"'){ 
           System.out.println(" \"\" is mismateched"); 
          } 
         } 

        } 
       } 
        input.close(); 
       } 
       catch(FileNotFoundException e){ 
        System.out.println("Cannot find file"); 
        e.printStackTrace(); 
       } 

      } 
      else{ 
       System.out.println("No command line argument"); 
      } 
    } 

} 
+0

ようこそ:

以下は、私のリビジョンを使用してプログラムの作業インスタンスです。 [help]にアクセスして[ask]を読むのに時間をかけてください。フォームの質問は "ここに私のコードは、それをデバッグしてください"はオフトピックと見なされます。 StackOverflowはディスカッション、チュートリアル、またはデバッグサイトではありません。この仕組みは、あなたが問題を解決しようとしているときに、難問にぶつかったときに助けを求めて、あなたが何を試みたのか、あなたが理解していないものを明確に説明することが求められます。少なくとも、IDEデバッガのコードをステップ実行して、期待通りの結果を特定できるはずです。 –

+0

コードをデバッグしようとしましたか?あなたのプログラマーがどこで、なぜあなたの '{'が正しく処理できないのかを教えてください。 – IQV

+0

[小規模プログラムのデバッグ方法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。[なぜ誰かが私を助けることができますか?質問?](http://meta.stackoverflow.com/q/284236) – EJoshuaS

答えて

0

をあなたのプログラムは99%正しいです:我々はまた、私はここでの主を提供MyStack.java

と呼ばれる当社独自のスタック方法を記述する必要があります。論理的な誤りがある唯一の部分は、二重引用符の特殊な場合です。

二重引用符は、引用の開始と終了の両方を表すのと同じ記号であるという意味で特別な記号です。あなたのリストの他のシンボルは、開始と終了の表記が異なります。例えば。ブラケット。開始括弧は '['で終わりは ']で示されます。しかし、二重引用符の場合、"は、引用符の開始または終了を示すことができます。

二重引用符は特別な記号なので、特別な方法で処理する必要があります。あなたのMyStackスタックに二重引用符をプッシュまたはポップするときは、それが開始か終了かを追跡する必要があります。それを追跡する方法はたくさんあります。私はそれを示すブール値のフラグを示唆しています。二重引用符をスタックにプッシュまたはポップするたびに、フラグを反転する必要があります。 StackOverflowのに

public static void main(String[] args){ 
     if(args.length>0){ 
      try{ 
       Scanner input = new Scanner(new File (args[0])); 
       MyStack<Character> ms = new MyStack<>(); 
       String str; 
       char ch; 
       boolean quoteStart = true; //Flag to indicate quote start or end 
       while(input.hasNext()){ 
        str = input.next(); 
        for(int i=0;i<str.length();i++){ 
         ch = str.charAt(i); 
         //Remove the " from the following condition. Handle it later. 
         if(ch == '{'||ch =='(' || ch=='[' || 
           (ch == '/'&&i<str.length() -1&&str.charAt(i+1)=='*')) 
         { 
          ms.push(ch); 
         } 
         else if (ch==')'){ 
          if(ms.isEmpty()||ms.pop()!= '('){ 
           System.out.println(") is mismatched"); 
          } 
         } 
         else if(ch == ']'){ 
         if(ms.isEmpty() || ms.pop() != '['){ 
          System.out.println("] is mismatched"); 
         } 
        } 
         else if(ch == '}'){ 
         if(ms.isEmpty() || ms.pop() != '{'){ 
          System.out.println("} is mismatched"); 
         } 
        } 
         else if(ch == '*' && i<str.length()-1&&str.charAt(i+1) == '/'){ 
         if(ms.isEmpty() || ms.pop() != '*'){ 
          System.out.println("*/ is mismatched"); 
         } 
        } 
        //Handle the quote here 
         else if(ch == '"'){ 
         if(quoteStart == true) { 
          ms.push(ch); 
          quoteStart = false; 
         } 
         else { 
          if(ms.isEmpty() || ms.pop() != '"'){ 
           System.out.println(" \"\" is mismateched"); 
          } 
          quoteStart = true; 
         } 
        } 

       } 
      } 
       input.close(); 
      } 
      catch(FileNotFoundException e){ 
       System.out.println("Cannot find file"); 
       e.printStackTrace(); 
      } 

     } 
     else{ 
      System.out.println("No command line argument"); 
     } 
} 
関連する問題