首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >区分数据类型和数据结构

区分数据类型和数据结构
EN

Stack Overflow用户
提问于 2015-04-30 15:04:09
回答 5查看 2K关注 0票数 3

嗯,不知怎么的,即使在阅读了很多教科书(真的很多)和上网很长一段时间后,我仍然无法完全理解这两件事之间的区别。

为了简化这个问题,让我们假设Wikipedia是一种数据类型:

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

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

好的,然后是数据结构:

1.数据结构可以实现一个或多个特定的抽象数据类型,这些抽象数据类型是指定操作契约及其复杂性的手段。相比之下,数据结构是ADT提供的契约的具体实现。

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

但这难道不是一种数据类型吗?

我真正能看到的是,数据类型可以从没有任何结构组织的非常简单的事物到复杂的数据结构--真正重要的是,它们是一个ADT的实现,反映了它的重要方面,它们可以被想象成一个单一的实体,比如(一个列表或树),但是数据结构必须至少包含某种逻辑或数学组织,才能将其分类为一个数据结构,但遗憾的是,这种差异会使许多实体同时拥有一个数据结构和一个数据类型。

那么,简单的平面(数据类型)和(数据结构)之间的实质区别是什么呢?

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-04-30 17:07:47

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

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

C标准第6.2.5节中完全描述了可以存在于C中的类型;例如,请参见N1570草案

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2015-04-30 16:26:18

参考>=C99:

这是两种数据类型:

  • 内在:charintfloatdouble_Complex_Boolvoid (对其中一些人来说,是longunsigned的变种)
  • 派生:数组、结构、联合、指针、函数

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

因此,要回答你的问题:

那么,简单的平面(数据类型)和(数据结构)之间的实质区别是什么呢?

“数据结构类型”是从“简单的普通数据类型”和/或其他“数据结构类型”派生出来的。

票数 2
EN

Stack Overflow用户

发布于 2015-04-30 20:43:52

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

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

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

代码语言:javascript
复制
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)队列。如果算法将项添加到数组中,使数组中的每个元素i ( a[i] >= a[2*i] )和a[i] >= a[2*i+1]都为真,则有一个堆。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29971248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档