2

私がやろうとしているのは、 eval 変数を取得して、その文字をそれぞれスタックに入れてから出力することです。EmptyStackException エラーが発生します (スタックに何もないことを意味すると仮定します)。私が理解していないのは、評価文字列が変数スタックに入れられたと思ったことです。なぜそれは空ですか?

public static void main(String[] args)
{

   Stack<String> variable = new Stack<String>();

   String eval = StdIn.readString();
   String alphabet = "abcdefghjiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";


   for (int i = 0; i < eval.length(); i++)
   {
       eval = eval.substring(i,i);

       if (eval.equals(alphabet.substring(0, 52)))// checks if eval is equal to any letter of alphabet
     {
           variable.push(eval);

       System.out.println(variable.pop());
     }
   } 
  }
}

私は日食を使用しています


サンプルラン:

input: hello
Exception in thread "main" java.util.EmptyStackException
at java.util.Stack.peek(Unknown Source)
at java.util.Stack.pop(Unknown Source)
at eval.main(eval.java:31)
4

5 に答える 5

6

このエラーが発生する唯一の方法は、次の場合です。

for (int i = 0; i < eval.length(); i++)
   {
       eval = eval.substring(i,i);

       if (eval.equals(alphabet.substring(0, 52)))
     {
           variable.push(eval);


     }
 System.out.println(variable.pop());
   } 

if条件の System.out.println(variable.pop());外側がある場合。

ポップ

public Object pop()

このスタックの最上位にあるオブジェクトを削除し、そのオブジェクトをこの関数の値として返します。

戻り値:このスタックの最上位にあるオブジェクト(Vectorオブジェクトの最後のアイテム)。スロー:

EmptyStackException-このスタックが空の場合。

pushあなたが投稿したコードでは、との数が同じでありpoppush操作が。よりも最初に来るため、これは不可能ですpop

あなたが入れたコード

ここに画像の説明を入力してください

あなたが得ているエラー

ここに画像の説明を入力してください

于 2012-12-03T23:42:27.837 に答える
6

私が見ることができるいくつかの問題があります:

  1. eval.substring(i,i);毎回空の文字列を返します。あなたはeval.substring(i,i + 1);、またはそれ以上のことを望んでいeval.charAt(i);ます。

  2. for返された substring/charAt 文字をループ内の独自の変数に入れたいと思うでしょう。現在eval、最初の繰り返しの後に文字列をオーバーライドしています。

  3. if (eval.equals(alphabet.substring(0, 52)))あなたのコメントから判断すると、あなたが思っていることをしません。文字列に別の文字列 (または単一の文字) が含まれているかどうかを確認する場合は、メソッドString#containsまたはString#indexOf.


簡単な修正済みスニペットを次に示します。

    String alphabet = "abcdefghjiklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String eval = "blah";
    Stack<Character> chars = new Stack<Character>();

    for(char c : eval.toCharArray()) {
        if(alphabet.indexOf(c) != -1) {
            chars.push(c);
            System.out.println(chars.pop());
        }
    }
于 2012-12-03T23:41:15.970 に答える
3

evalスタックにプッシュする前に、各文字が文字であることを確認する必要があります。のすべての文字を確認したらeval、スタックからすべてをポップして印刷します。

for(int i = 0; i < eval.length(); i++) {

    if(alphabet.contains(eval.charAt(i))) {

        variable.push(eval.charAt(i));
    }
}

while(!variable.isEmpty()) {

    System.out.println(variable.pop());
}
于 2012-12-03T23:44:57.130 に答える
2

これで問題が解決するはずです。プッシュした後にのみポップする必要があります。したがって、両方とも if ステートメント内にある必要があります。

    for (int i = 0; i < eval.length(); i++)
    {
       if (alphabet.contains(eval.substring(i,i+1))
       {
           variable.push(eval.substring(i,i+1));
           System.out.println(variable.pop());
       }
     } 
于 2012-12-04T00:11:43.023 に答える
1

入力から読み取った文字列内の文字が文字かどうかを確認し、それらを stac に入れたい場合は、エンコーディングを気にすることなく、文字に対してあらゆる種類のテストを実行できるCharacter クラスの使用を検討する必要があります。あなたの場合に役立つ可能性のある方法isLetterは、文字が文字かどうかを確認する です。

スタックの問題に関しては、コードは実際にスタックの一番上に値をプッシュし、すぐにpopそれをプッシュします。これは、ループの最後でスタックが空である理由を説明しています。peek代わりにメソッドを使用する必要があります。

于 2012-12-03T23:56:08.720 に答える