44

今日、私はjava.util.Stackクラスをプッシュしてから、を使用しIteratorて(ポップを使用せずに)アイテムを反復処理しようとしていました。LIFO物件を期待していたのですがビックリ。

これが私が試していたコードです。

import java.util.*;
import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        RobStack<Integer> rstack = new RobStack<Integer>(); // Correct Implementation
        Stack<Integer> jstack = new Stack<Integer>(); // Default Java Implementation
        rstack.push(0); jstack.push(0);
        rstack.push(1); jstack.push(1);
        rstack.push(2); jstack.push(2);
        rstack.push(3); jstack.push(3);

        System.out.print("Algo Stack: ");
        for (int i : rstack)
            System.out.print(i + " ");
        System.out.print("\nJava Stack: ");
        for (int i : jstack)
            System.out.print(i + " ");
    }

}

上記のプログラムの出力を以下に示します。

Algo Stack: 3 2 1 0 
Java Stack: 0 1 2 3 

上記のコードjstackでは、デフォルトの Java 実装をrstack使用し、Robert Sedgewick によってAlgorithm クラスに提供された実装を使用しています。ロバート教授の実装は問題なく動作することがわかりましたが、java.util.Stack実装は失敗しました。

それはバグですか、それとも仕様ですか?

4

7 に答える 7

34

Bug ID 4475301: RFE: java.util.Stack.iterator() iterates the wrong wayを参照してください。この動作は (悪い) 設計によるものです。Java の組み込みStack反復子メソッドは他のクラスから継承されるため、期待どおりに動作しません。

于 2013-06-07T20:58:24.440 に答える
13

Stack の代わりに Deque を使用する必要があります。

Deque<Integer> stack = new ArrayDeque<Integer>();

オラクルのドキュメントを参照してください

于 2014-12-15T19:33:06.207 に答える
3

原則として、 a を反復処理するのではなく、Stack上にプッシュするか、上からポップするだけです。実際の実装に関しては、Java を含むほとんどの言語は別の言語を使用collection typeしてStack. 厳密な要件の観点から、一定時間のpush, top and pop操作を許可する必要があります。

追加機能 (この場合はバグ) は無視して、コーディングに依存しないでください。

于 2013-06-07T21:01:30.067 に答える
2

おそらく、.get() を使用して、スタック内のアイテムを上から下に出力できます。

Stack<Integer> stack = new Stack<Integer>();
stack.push(3);
stack.push(2);
stack.push(1);
// print from top to bottom
for(int i = stack.size() - 1; i >= 0; i--){
   System.out.println(stack.get(i));
}
/*
output
1
2
3
*/
于 2015-07-14T19:19:50.230 に答える
1

StackはAbstractListから.listIterator()を継承し、逆順の反復を可能にします。

Stack<Integer> stack = new Stack<Integer>();
stack.push(1);
stack.push(2);
stack.push(3);
for (ListIterator<Integer> iterator = stack.listIterator(stack.size()); iterator.hasPrevious();) {
    Integer integer = iterator.previous();
    System.out.println(integer);
}
// Output: 3 2 1
于 2014-06-19T09:52:19.170 に答える
1

Eclipse Collectionsには、反復子が上から下に値を返す可変スタック実装が含まれています。このコードは、3、2、次に 1 を出力します。

MutableStack<Integer> stack = ArrayStack.newStack();
stack.push(1);
stack.push(2);
stack.push(3);
for (Iterator<Integer> iterator = stack.iterator(); iterator.hasNext(); )
{
    Integer each = iterator.next();
    System.out.println(each);
}

MutableStackMutableCollectionまたはは拡張Collectionされないため、たとえば、スタックの途中から削除することはできません。forEach()select()collect()anySatisfy()、などの内部反復パターンを実装するメソッドallSatisfy()も、要素を上から下に処理します。このコードは同じものを出力します。

stack.forEach(Procedures.println(System.out));

注:私は Eclipse コレクションのコミッターです。

于 2013-09-03T15:22:09.037 に答える
0

a の代わりに aを使用し、andメソッドを使用Stackできます。LinkedListpushpop

于 2020-09-15T10:28:14.423 に答える