我在线搜索了Java中pop()函数的代码实现。我经常看到计数器(堆栈顶部所在的位置)减少了1,有效地使其无法访问,但直到被覆盖才将其完全删除。这是否也是用该语言实现的方式,还是由于他们使用数组来实现堆栈功能?另外,该语言是否使用数组,链接列表或其他某种数据结构来实现堆栈?谢谢!
答案 0 :(得分:1)
记录下来,自从我在下面写下答案以来,问题已经改变。这个问题最初是关于队列和堆栈的。现在标题仅询问队列,而问题的正文仅涉及堆栈。
该问题的标题同时提到了队列和堆栈,但是这些不是同一回事。队列是一种在通常情况下实现先进先出规则的结构(双端队列的双端队列是另一回事)。想想公交车的排队:首先到达公交车站的人应该是公交车到达时第一个上车的人。相比之下,堆栈显示后进先出行为。该名称倾向于表明:将项目“堆叠”在彼此的顶部,而顶部的(最后放置的)则是可访问的项目。
queue
是Java中的接口,而不是类,因此有多个实现。 JDK版本7列出了13个已知的实现类。只要pop
符合删除前(最旧)元素的语义,它就可以正确地完成工作。但是pop
对于队列中的方法来说是不合适的名称,并且实际上java.util.queue
接口没有定义pop
。
与queue
不同,stack
是Java中的类而不是接口,它基于较旧的vector
类。因此,我认为最后插入的项在向量中的索引最高,而pop
则将其删除。像
E pop() { remove(size()-1); }
或至少一个逻辑等效的序列。那显然是基于向量的实现。如在其他地方指出的,如果实现还使向量中现在不可访问的单元格无效,则它将不保留对不再位于“堆栈”中的对象的引用,这将很有用。
答案 1 :(得分:0)
https://docs.oracle.com/javase/7/docs/api/java/util/Stack.html
public E pop()移除此堆栈顶部的对象并返回 该对象作为此函数的值。
所有已实现的接口:可序列化,可克隆,可迭代, 收集,列表,RandomAccess
堆栈实际上是一个Vector,它是一个List,因此您对它的更深功能的假设是正确的。
答案 2 :(得分:0)
堆栈的源代码可以在这里找到:http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/util/Stack.java
它从父类Vector调用removeElement。在javadoc中,您还应该注意,他们建议您改用Deque,它是双端队列。向量由数组支持,弹出时确实将数组中的元素设置为null,以便垃圾收集器可以在不再需要该对象时完成其工作。
矢量源代码:http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/00cd9dc3c2b5/src/share/classes/java/util/Vector.java