为什么Stack使用基于1的索引而不是Java中数组的基于0的索引?

3
为什么Java中的Stack实现在search(Object)方法中返回从栈顶开始的基于1的位置,而不是我们通常在数组中使用的基于0的位置?这是否有特殊原因或者如果我们使用基于0的索引会出现哪些问题?

1
是的,没错。Stack类中的search(Obj)方法。 - Praveen Kishor
我只是猜测,但我的猜测是它描述了您需要调用“pop”的次数以获取对象。 - T.J. Crowder
4
Stack 是 JDK 1.0 中的类之一,API 文档建议使用 Deque。原始 API 存在缺陷,其中许多类与相关的 C 库非常接近。很可能他们只是碰巧使用了“Stack”,一旦 API 发布就太晚更改了。 - ewramner
2个回答

1
Stack.search 返回的 位置 是从数据结构的末尾开始计算的,而 索引 是从开头开始计算的。范围通常被指定为半开区间,因此第一个元素距离边界的距离是非零的。类似的方法 List.lastIndexOf 给出了列表开头的值。 searchlastIndexOf 返回值的总和是 size
@TJCrowder 还指出,search 位置与获取该元素所需进行的 pop 次数相匹配。
请注意,API 文档说明:

Deque 接口及其实现提供了更完整和一致的 LIFO 栈操作集,应优先使用。

编辑:有趣的是,它继续建议使用以下代码(甚至不链接到 Deque 类型):
Deque<Integer> stack = new ArrayDeque<Integer>();

由于糟糕的决策,“Deque”是一个“Queue”。因此,您可以但不应该编写以下内容:
Queue<Integer> doNotDoThisFFS = new ArrayDeque<Integer>();

正确的写法是 "Stack<Integer> stack = new Stack<>();"。
Queue<Integer> stack = Collections.asLifoQueue​(new ArrayDeque<Integer>());

1

您可以在文档中查看。

...此方法返回距离堆栈顶部最近的出现的距离;堆栈上方的最顶部项被视为距离1...

该方法从堆栈大小中减去基于0的lastIndexOf()Vector基类相同。

来自源代码

public synchronized int search(Object o) {
    int i = lastIndexOf(o);

    if (i >= 0) {
        return size() - i;
    }
    return -1;
}

如果栈中只有一个元素,比如说"A",那么它就是最顶端的元素,因此距离栈顶的距离为1。 size() - lastIndexOf("A") == 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接