1

次のことを行うには、メソッドを作成する必要があります。

メソッド compress の目的は、スタック s1 からすべての null 要素を削除することです。残りの (null 以外の) 要素は、最初の順序で s1 に保持する必要があります。補助スタック s2 は、s1 の要素の一時ストレージとして使用する必要があります。このメソッドの計算の最後に、スタック s2 は計算の開始時と同じ内容を持っている必要があります。メソッド compress の予想される動作の例については、メソッド main を参照してください。

これまでのところ、私は持っています。

import net.datastructures.ArrayStack;
import net.datastructures.Stack;

public class Stacks {

public static <E> void compress(Stack<E> S1, Stack<E> S2) {

    int counter = 0;
    while (!S1.isEmpty()) {

    }
    if (S1.top() == null) {
        S1.pop();
    } else if (S1.top() != null) {
        S2.push(S1.pop());

        counter++;
    }

    for (int i = counter; i < counter; i++) {

        S2.push(S1.pop());
    }
}

public static void main(String[] args) {
    // test method compress
    Stack<Integer> S1 = new ArrayStack<Integer>(10);
    S1.push(2);
    S1.push(null);
    S1.push(null);
    S1.push(4);
    S1.push(6);
    S1.push(null);

    Stack<Integer> S2 = new ArrayStack<Integer>(10);
    S2.push(7);
    S2.push(9);

    System.out.println("stack S1: " + S1);
    // prints: "stack S1: [2, null, null, 4, 6, null]"

    System.out.println("stack S2: " + S2);
    // prints: "stack s2: [7, 9]"

    compress(S1, S2);

    System.out.println("stack S1: " + S1);
    // should print: "stack S1: [2, 4, 6]"

    System.out.println("stack S2: " + S2);
    // should print: "stack S2: [7, 9]"
}

}

どこが間違っているのかわかりません。コードは圧縮メソッドの前の 2 行を出力し、その後何も出力しません。

4

3 に答える 3

0
while (!S1.isEmpty()) {

}

そこには、無限ループがあります。

于 2013-02-23T21:11:51.227 に答える
0

以下のように while() 内に if...else を書いていると思います

while (!S1.isEmpty()) {
if (S1.top() == null) {
    S1.pop();
} else if (S1.top() != null) {
    S2.push(S1.pop());

    counter++;
}

}

そしてあなたの中でそれは次のようなものでなければなりません

for (int i = counter; i < counter; i++) {

    S1.push(S2.pop());
}

うまくいくはずだと思います

于 2013-02-23T21:17:26.730 に答える
0

あなたのコードに 2 つの間違いを見つけました。各サイクルに 1 つ。

  1. ループwhileはその直後に条件をラップする必要があります。
  2. forループのインクリメント変数が正しく割り当てられていません。

正しいバージョンは次のとおりです。

public static <E> void compress(Stack<E> S1, Stack<E> S2) {
    int counter = 0;

    while (!S1.isEmpty()) {
        if (S1.top() == null) {
            S1.pop();
        } else {
            S2.push(S1.pop());
            counter++;
        }
    }

    for (int i = 0; i < counter; i++) {
        S1.push(S2.pop());
    }
}

編集:同等のforループ(おそらくこれを書こうとしていた)は次のようになります。

for (int i = counter; i > 0; i--) {
    S1.push(S2.pop());
}

2 番目の編集:ループ内の変数forが切り替えられました (S2 は S1 の場所にあり、その逆もありました)。

于 2013-02-23T22:02:49.840 に答える