【问题标题】:Distinguishing Data Types and Data structures区分数据类型和数据结构
【发布时间】:2022-01-05 00:10:15
【问题描述】:

好吧,不知何故,即使在阅读了很多教科书(真的很多)和互联网上很长一段时间后,我仍然无法完全理解所提到的两者之间的区别。

为了简化问题,假设维基百科的数据类型是:

识别各种类型数据之一的分类,例如实数、整数或布尔值,用于确定该类型的可能值;可以对该类型的值进行的操作;数据的含义;以及该类型值的存储方式。

它主要是一些抽象数据类型的实现,例如实数或整数。

好了,接下来就是数据结构了:

是一种在计算机中组织数据的特殊方式,以便可以有效地使用它。[1][2]数据结构可以实现一种或多种特定的抽象数据类型,它们是指定操作契约及其复杂性的手段。相比之下,数据结构是 ADT 提供的合约的具体实现

因此,数据结构是 ADT 的实现,例如堆栈或队列。

但这不也使它成为一种数据类型吗??

我真正看到的是,数据类型的范围可以从没有任何结构组织的非常简单的事物到复杂的数据结构,真正重要的是它们是 ADT 的实现,反映了它的重要方面,并且它们可以设想为单个实体,如(列表或树),但数据结构必须至少包含某种逻辑或数学组织才能归类为数据结构,但遗憾的是,这种差异会使许多实体既是数据结构又是数据类型同时进行。

那么简单的plain(数据类型)和a(数据结构)之间的本质区别是什么?

如果有人可以向我推荐一些关于 C 语言数据结构的好书,我很乐意接受指定一本关于该主题的特定书籍的答案,该书籍的深度足以解释所有这些问题。

【问题讨论】:

    标签: c data-structures types


    【解决方案1】:

    在 C 中,数据类型是一种语言级别的构造。有数量有限的预定义类型(intchardouble 等),以及几乎无限数量的派生类型(数组类型、结构类型、联合类型、函数类型、指针类型、原子类型(后者是 C11 中新增的)。

    任何类型都可以通过typedef 声明获得一个简单的名称。对于函数类型或不完整类型以外的任何类型,您都可以拥有该类型的 objects;每个对象占用一个连续的内存区域。

    C 中可以存在的类型在 C 标准的第 6.2.5 节中有完整的描述;例如,参见N1570 draft

    另一方面,数据结构是由您自己的代码定义的构造。该语言没有定义链表二叉树哈希表的概念,但是你可以实现这样的数据结构,通常通过在派生数据类型之上构建它。通常没有像 object 这样的东西,它是一个链表。链表数据结构的实例由相关对象的集合组成,只有代码的逻辑才能将该集合转换为连贯的实体。但是您通常会拥有某种数据类型的对象,您的程序使用该对象来引用链表数据结构,可能是结构或指向结构的指针。

    您通常会拥有一组对数据结构实例进行操作的函数。这些函数是否是数据结构的一部分是一个难题,我不会在这里尝试回答。

    例如,一个数组既可以被认为是一种数据类型,也可以被认为是一种数据结构;更准确地说,您可以将其视为使用现有数组类型实现的数据结构。

    【讨论】:

    • 好的,你的回答很有帮助,但要澄清一些观点。总而言之,您说有两件事有所不同,首先是数据类型是语言级别的,其次只有我的代码的逻辑将代码的某些部分转换为连贯的实体,例如堆栈或链表。这也得到了以下事实的进一步支持:不会有(至少是 C)一个完整的实体,称为堆栈。这里的问题在于三件事。首先:你的意思是什么(在 C 中,数据类型是.....)这个定义是否因语言而异?
    • (其余)第二部分:第二部分(我的第二点)仅适用于 C,但不适用于 C++,因为在 C++ 中,您可以使用类仅定义具有所有属性和方法的单个实体包含一个称为堆栈的实体,那么它现在是否会被视为一种数据类型?第三:你的最后两行是什么意思(例如一个数组,可以是......),你能在这里进一步解释你的观点吗? @基思汤普森
    • 我用 C 语言回答,因为问题被标记为“c”。其他语言可能对“类型”或“数据类型”有不同的定义。 C++ 类类型的对象仍然是对象;它不一定包含它所引用的数据(C++ 对“对象”的定义与 C 非常相似,并且 not 是指“面向对象”编程)。 C 数组类型是 type;它指定内存中的特定布局。您可以使用它来包含更抽象的数据结构,例如数字序列。
    • @KeithThompson 数组作为数据类型定义了我们想要的操作,比如基于索引的搜索等等。它没有指定内存中的特定布局。数组数据结构就是这样做的。还是我错了?
    • @SurajJain:C 的数组类型定义了布局。我在之前的评论中已经说过了。
    【解决方案2】:

    引用>=C99:

    有两种数据类型:

    • 内在:charintfloatdouble_Complex_Boolvoid(对于其中一些有long@9@ 和@9876543 的变体)
    • 派生:数组、结构、联合、指针、函数

    后者是从前者和/或后者构建的。


    所以回答你的问题:

    那么简单的plain(数据类型)和a(数据结构)之间的本质区别是什么?

    数据结构 [类型]”派生自“简单的普通数据类型”和/或其他“数据结构 [类型]” "(s).

    【讨论】:

    • IMO,指针不是从内部列表中的类型派生的——尤其是函数指针。我想说指针也是内在的
    • @chux: C11 - 6.2.50/20: "指针类型可以派生自函数类型或对象类型,称为引用类型。指针类型描述了一个对象,其value 提供对被引用类型实体的引用。从被引用类型 T 派生的指针类型有时称为“指向 T 的指针”。从被引用类型构造指针类型称为“指针类型派生” '。指针类型是完整的对象类型。" :-)
    • 所以 C11 - 6.2.50/20 说指针是“...派生自函数类型或对象类型...”,而不是来自内在。这个 intrinsic 列表很好地匹配了规范的 object type,它不包含函数。
    • 恕我直言,这不是正确的区别。链表或二叉树是一种数据结构,但它既不是内在类型也不是派生类型。我在回答中对此进行了扩展。
    • @KeithThompson:在回答时,我关注的是 C 语言中可用的“数据类型”。在更广泛(常识)意义上寻找“数据结构”,您的答案可能是 OP 所追求的。
    【解决方案3】:

    数据类型指定单个表达式或对象允许的值和操作; 数据结构是一个存储区域和在该存储中组织对象的算法。

    一个数据类型的例子是int;这种类型的对象可能会在至少[-32767, 32767]范围内存储整数值,通常的算术运算可能会在这些对象上执行(尽管整数除法的结果也是一个整数,这会让人绊倒第一次)。您不能在int 上使用下标运算符[],也不能在int 对象上使用函数调用() 运算符。

    对于数据结构的示例,我们可以看一个简单的堆栈。我们将使用一个数组作为我们的存储区域。我们将定义一个额外的整数项作为堆栈指针——它将包含最近添加到数组中的元素的索引。我们定义了两种算法——pushpop——它们会以特定的顺序向堆栈添加和删除项目。

    push: if sp is less than stack size then
            add 1 to sp
            write input to array[sp]
          else
            stack overflow
          end if
    
     pop: if sp is greater than 0 then
            get value from array[sp]
            subtract 1 from sp
            return value
          else
            stack underflow
          end if
    

    我们的堆栈数据结构存储了一些数据类型的对象,这样最后添加的项目总是第一个被删除的项目,也就是后进先入-出(LIFO)队列。如果我们将值 1、2 和 3 压入堆栈,它们将按 3、2 和 1 的顺序弹出。

    请注意,区分数据结构的是算法,而不是存储类型。如果您的算法将一个项目添加到数组的一端并从另一端拉出它们,那么您就有一个先进先出 (FIFO) 队列。如果您的算法将项目添加到数组中,使得数组a[i] >= a[2*i]a[i] >= a[2*i+1] 中的每个元素i 都为真,那么您就有了一个堆。

    【讨论】:

    • 抽象数据类型和数据类型有什么区别。数据类型=抽象数据类型+数据结构。数据类型是否包括实现?
    【解决方案4】:

    基本上, 数据类型定义了某个值域,并定义了对这些值允许的操作。编译器定义的所有基本数据类型都称为原始数据类型 数据结构是一种用户定义的数据类型,是组织数据以便有效使用的系统方法。这些的操作和取值不是语言本身指定的,而是用户自己指定的。

    了解更多关于这方面的书是“The C Programming Language - Dennis Ritchie”

    【讨论】:

    • 《C 编程语言》已有 25 年历史了……还有很多最新的文章,有更多最新的想法
    猜你喜欢
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2021-05-08
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    相关资源
    最近更新 更多