java.util.Stack的Iterator中是否有错误?

vin*_*hew 32 java algorithm stack data-structures

今天我试图在java.util.Stack课堂上推进,然后Iterator通过项目使用迭代(不使用pop).我期待着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 + " ");
    }

}
Run Code Online (Sandbox Code Playgroud)

以上程序的输出如下:

Algo Stack: 3 2 1 0 
Java Stack: 0 1 2 3 
Run Code Online (Sandbox Code Playgroud)

在上面的代码中jstack使用了默认的Java实现,并rstack使用Robert Sedgewick提供实现来获取他的Algorithm类.我发现罗伯特教授的实施工作正常,但java.util.Stack实施失败了.

它是一个错误还是设计

Bil*_*ard 29

请参阅错误ID 4475301:RFE:java.util.Stack.iterator()以错误的方式迭代.这种行为是(坏的)设计.Java的内置Stack迭代器方法继承自其他类,因此它们的行为与您期望的不同.

  • @vincentmathew 即使他们对 `Stack` 有不同的内部表示(这很可能;我认为他们使用扩展数组方法),他们也可以想出一些按预期顺序迭代的 `iterator()` 方法。我想迭代顺序并不是堆栈数据结构设计合同的一部分,但对我来说它仍然是一个糟糕的选择。 (2认同)

Bas*_*hir 9

您应该使用Deque而不是Stack.

Deque<Integer> stack = new ArrayDeque<Integer>();
Run Code Online (Sandbox Code Playgroud)

请参阅Oracle Doc