繁体   English   中英

pop() 功能如何在 Java 的堆栈中工作?

[英]How does the pop() functionality work in stacks in Java?

我在网上搜索了Java中pop()函数的代码实现。 我经常看到计数器(堆栈顶部所在的位置)减 1,有效地使其无法访问,但在被覆盖之前不会完全删除它。 这也是在语言中实现的方式,还是由于它们使用数组来实现堆栈功能的事实? 此外,该语言是否使用数组、链表或其他一些数据结构来实现堆栈? 谢谢!

作为记录,自从我在下面写下答案以来,问题已经改变。 这个问题最初是关于队列和堆栈的。 现在标题只询问队列,而问题的主体只讨论堆栈。


问题的标题提到了队列和堆栈,但它们不是一回事。 队列是一种在常见情况下实现先进先出规则的结构(双端队列——双端队列——是另一回事)。 想想公交车的排队情况:首先到达公交车站的人应该是公交车到达时第一个上车的人。 相比之下,堆栈显示后进先出行为。 该名称往往表明:项目彼此“堆叠”在一起,顶部的(最后放置的)是可访问的。

queue是 Java 中的一个接口,而不是一个类,所以有不止一个实现。 版本 7 JDK 列出了 13 个已知的实现类。 只要pop满足删除前面(最旧)元素的语义,它就可以正确地完成工作。 然而,对于队列上的方法来说, pop是一个不合适的名称,实际上java.util.queue接口并没有定义pop

queue不同, stack是一个类而不是 Java 中的接口,并且基于旧的vector类。 因此,我想最后插入的项目在向量中具有最高的索引,而pop只是将其删除。 就像是

    E pop() { remove(size()-1); }

或者至少是逻辑上等效的序列。 这是基于向量的明显实现。 正如其他地方所指出的,如果实现也将向量中现在不可访问的单元格清空,则它是有用的,这样它就不会保留对不再“在”堆栈中的对象的引用。

https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html

public E pop() 移除此堆栈顶部的对象并将该对象作为此函数的值返回。

所有实现的接口:Serializable、Cloneable、Iterable、Collection、List、RandomAccess

堆栈实际上是一个向量,它是一个列表,因此您对其更深层次功能的假设是正确的。

堆栈的源代码可以在这里找到: http : //hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/Stack.java

它从父类 Vector 调用 removeElement。 在 javadoc 中,您还应该注意他们建议您改用 Deque,这是一个双端队列。 Vector 由一个数组支持,当它被弹出时,它确实将数组中的元素设置为 null,以便垃圾收集器可以在不再需要该对象时执行其工作。

矢量源代码: http : //hg.openjdk.java.net/jdk7/jdk7/jdk/file/00cd9dc3c2b5/src/share/classes/java/util/Vector.java

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM