Java 所有数据结构都是抽象数据类型吗?

Java 所有数据结构都是抽象数据类型吗?,java,list,data-structures,heap,abstract-data-type,Java,List,Data Structures,Heap,Abstract Data Type,我在一些地方读到了关于这个话题的矛盾的东西,比如这里 答案是: 优先级队列和堆都是数据类型(更准确;抽象数据类型或ADT) 但是这里 堆不是ADT。这是一种数据结构。 例如在书中: Java软件结构,国际版[John Lewis,Joseph Chase] 它有一个堆作为ADT和一个DS,代码如下: public interface HeapADT<T> extends BinaryTreeADT<T> { /** * Adds the specified objec

我在一些地方读到了关于这个话题的矛盾的东西,比如这里

答案是:

优先级队列和堆都是数据类型(更准确;抽象数据类型或ADT

但是这里

堆不是ADT。这是一种数据结构。

例如在书中:

Java软件结构,国际版[John Lewis,Joseph Chase]

它有一个堆作为ADT和一个DS,代码如下:

public interface HeapADT<T> extends BinaryTreeADT<T>
{
/**
* Adds the specified object to this heap.
*
* @param obj the element to be added to this heap
*/
public void addElement (T obj);
/**
* Removes element with the lowest value from this heap.
*
* @return the element with the lowest value from this heap
*/
public T removeMin();
/**
* Returns a reference to the element with the lowest value in
* this heap.
*
* @return a reference to the element with the lowest value in this heap
*/
public T findMin();
}
公共接口heapdt扩展了binarytreeeadt
{
/**
*将指定的对象添加到此堆。
*
*@param obj要添加到此堆的元素
*/
公共无效附加条款(T obj);
/**
*从此堆中删除值最低的元素。
*
*@返回此堆中值最低的元素
*/
公共T removeMin();
/**
*返回对中具有最小值的元素的引用
*这堆。
*
*@返回对该堆中具有最低值的元素的引用
*/
公共T findMin();
}
主要问题是,例如,如果我们说DS的所有行为定义都是ADT

  • 列表是静态和动态数组、链表的ADT
  • 堆栈是一个ADT,但您可以使用数组或链表实现堆栈,但最后该堆栈是一个数据结构
  • 队列,与堆栈相同
  • ,与堆栈相同
因此,抽象数据类型是您将使用另一个具有自己ADT的数据结构实现的行为

这是正确的吗


谢谢

正如您所说,抽象数据类型描述实体的行为(或“语义”)(通常从使用该实体的人的角度)。因此,在您的示例中,堆栈、队列、列表等

数据结构只是组织数据的一种特殊方式。因此,这只是表示数据类型的一种方法

主要问题是,如果我们说DS的所有行为定义都是ADT


我不会那么说。如果我定义了一个表示
汽车的经典示例的数据结构(同样,将数据结构视为组织数据的一种方式),那么该数据结构的行为不一定表示ADT。

当然,汽车不表示ADT,但是你可以用一种特殊的行为来抽象这辆车,然后它就变成了ADT。对吧?我觉得我们太过倾向于形而上学了。我的意思是,ADT的存在是因为它有用,而不是因为它的某些固有属性。汽车“抽象”不足以被视为ADT。因为这是一件非常具体的事情。消息列表可以在摘要中表示为队列(ADT)。也就是说,ADT是一种抽象。它不是从数据结构派生出来的,但可以用数据结构实现。我的印象是你在向后思考这个问题,或者可能只是我,我无法清楚地表达我的意思。你解释得很好,我理解的真正问题是,为什么有人会说堆不是adt,例如,因为你可以用数组和指针实现它,也许不在同一时间复杂度,但我认为这也是ADT,例如,你能说dinamic数组是和ADT,或者dinamic数组是列表的数据结构吗?谁定义了正式列表?因此,您也可以说您有类似于adt的数组和类似于DT的实现,对吗?感谢您的回答。我将尝试用其他术语(非常简单,一点也不严格):ADT是“我可以在一个实体上执行这些操作”,数据结构是“为了实现这个实体,我需要这样做”。堆是一个实现细节。您可以插入内容并从中获取内容,但这也是映射(即ADT)的定义。堆是实现映射的一种特殊方式。就像您可以使用动态数组实现队列、列表和堆栈(如果您愿意浪费时间,甚至可以实现映射:P)。希望这有帮助:)@FedericoklezCulloca堆是实现映射的一种特殊方式。不是真的。我的意思是,您可以在堆中实现一个映射,但它的效率非常低:就像一个列表。堆是优先级队列ADT的一个实现。地图是一种完全不同的东西:这个问题在这里和软件工程中都被问到了。请看,或者只是在[抽象数据类型和数据结构之间的差异]上进行谷歌搜索。也许软件工程是一个最好的地方,但我认为谷歌搜索是不够的,因为它有很多“版本”,如果有人定义像ADT、antoher和DS这样的堆,那么真正的来源是什么。有些人定义了heap和DT,你也可以用指针来实现。但我认为有些人只是像鹦鹉一样说这句话,因为他们从不引用任何一本书或类似的东西,就像我所做的那样,有些时候这本书在算法和Java软件结构之间存在矛盾。就像你在这里的第二个问题中看到的
ADT:List DS:ArrayList,但是,如果你在N. S. KUTTI,p.y.PADHE中读取C++中的数据结构,他们就定义了数组,比如ADT和DT。