0

こんにちは、私は、ユーザーが一連のブラケット (一度に 1 つ) を入力し、対応する終了ブラケットがあるかどうかを確認できるようにするプログラムを作成しようとしています。読みやすくするために、括弧は毎回新しい行に入力されます。私はそれのためにADTを設定しましたが、whileループを実行してチェックする方法を考えることができません.. (ブラケットが入力されているかどうかはわかっています。それをスタックにプッシュする必要があり、(が入力したスタックの1つをポップする必要がありますが、真ん中のビットを解決することはできません:)

//main code   
import java.util.*;

public class SameBrackets
{
   public static void main(String[] args)
   {
      Stack bracket = new Stack();
      Scanner kybd = new Scanner(System.in);

      System.out.print("Enter bracket > ");
      String bracketentered = kybd.next();


          if ("(".equals(bracketentered) )
          {
                 bracket.push(bracketentered);
                 System.out.println(") needed");
          }
          else if (")".equals(bracketentered))
          {
              bracket.pop();
              System.out.println("( needed");
          }


      }
  }

//ADT コード

public class Stack
{
    private String[] a;         //String array
    private int top;

    public Stack()
    {
       a = new String[1];           //create String array
       top = 0;                      
    }

    public boolean isEmpty()
    {
         return top == 0;
    }

    public String pop()          //pop String element
    {
        top--;
        return(a[top]);         //underflow not protected
    }

    public void push(String x)      //push String element
    {
        if (top == a.length)
        {
            resize();
        }
        a[top] = x;
        top++;
    }  

    private void resize()
    {
        String[] temp = new String[a.length * 2];   //resize String array
        for (int i = 0; i < a.length; i++)
        {
            temp[i] = a[i];
         }
        a = temp;
    }
}
4

3 に答える 3

1

独自のスタックを実装する必要はありません。LinkedList(具体的には、Deque実装するインターフェース)はすでにそれを実行できます。しかし、それは良い運動です。

あなたのコードには2つのことが欠けています。

  • ある終わりに達するまで続くループ。System.in残念ながら、コンソールからテキストを入力するときに、の終わりに到達するのはそれほど簡単ではありません。終了できるのは通常Ctrl-Dです。独自の停止メカニズムを追加することは良い考えです。ほとんどの人は、他の方法でプログラムを終了する方法を知りません。
  • スタックから飛び出したブラケットが、入力したばかりのブラケットと一致することを確認する必要があります。
  • 最後にスタックが実際に空であることを確認する必要があります。

そうすると、次のような結果になります

// a stack. You can use your own instead.
Deque<String> stack = new LinkedList<String>();
Scanner kybd = new Scanner(System.in);

String bracketentered;

// 1) repeat while there is more, CTRL-D should end here.
while (kybd.hasNext()) {
    System.out.print("Enter bracket or 'q' to quit:");
    bracketentered = kybd.next();

    if (bracketentered.equals("q")) {
        break; // end this loop
    }

    if ("(".equals(bracketentered)) {
        // just push to stack
        stack.push(bracketentered);
    }
    else if (")".equals(bracketentered)) {
        // in case the stack is empty:
        // stack.pop() throws an exception
        // stack.poll() returns null
        String opposingBracket = stack.poll();

        // there must be a "(" on the stack(
        if (!"(".equals(opposingBracket)) {
            System.out.println("Wrong bracket");
        }
    }
    else {
        // in case it's not ( or )
        System.out.println("Illegal input:" + bracketentered);
    }
}
// 3) loop finished via "q" or end of input - check that stack is empty
if (!stack.isEmpty()) {
    System.out.println("You forgot to close the following brackets:");
    while (!stack.isEmpty()) {
        System.out.print(stack.poll() + " ");
    }
    System.out.println();
}

ループ内のスタックとブラケットのカウントについて:最後にのみチェックする非常に単純なブラケットカウントアルゴリズムでは、が可能) (になります。各ステップでチェックするよりスマートなアルゴリズムでは、のような複数のブラケットの組み合わせで失敗する可能性があり[ ( ] )ます。スタックは、それらが正しく階層化されていることを確認します[ () ]

于 2012-11-26T15:14:47.537 に答える
1

次のようなものを探していますか?

if ("(".equals(bracketentered) ) {
    bracket.push(bracketentered);
} else if (")".equals(bracketentered)) {
    bracket.pop();
}
if ( bracket.isEmpty () ) {
    System.out.println("( needed");
} else {
    System.out.println(") needed");
}
于 2012-11-26T15:09:35.817 に答える