数据结构与数据类型的那点纠葛
1.简单对比
数据结构=数据元素+数据关系;数据类型=数据结构+数据操作;
所以数据类型的范畴和类有点相似。其实类也是一种数据类型。int,char基本类型同样可以抽象成数据结构和数据元素的模型,只是这里的数据元素是规定内存分配大小。只要定义了一个变量或者一个对象,这个变量或者对象就应该是有值的,因为内存单元是实实在在存在的,只要有内存单元就会有值,然后我们可以初始化这个变量或者对象,然后对其进行操作。
2.关于原子和分子的比喻
int char float double这些是数据类型,类比作原子,他们间的不同就是元素种类的不同,只涉及自身的不同,比如两种原子内的质子中子数不同,是一种内在属性。链表队列堆栈树这些是数据结构,类比作分子,他们间描述的是数据间的关系,就如同分子描述了原子的组合方式。
实际上,数据类型是一种属性,数据结构是一种关系,都很抽象,严格说起来,应该把数据类
型比作元素种类,数据结构类比作化学式/分子式。但是这样没有起到比喻说理的效果,依然很抽象,所以依然选择原子和分子来说明(一般人想到原子应该都会觉得就像一个一个小球吧,这样就更易理解)。
再说说只含有一个数据的链表/队列/堆栈/树,依据你给的定义:“相互之间存在一中或多种特定关系的数据元素的集合”,只含有一个数据甚至不含有数据也能算作一个“集合”;从实际结构上来说,一个链表只含有一个数据甚至不含数据,他还是会有指针域和表头,队列/堆栈等也一样,而这些部分就表现了“关系”。相反,单个int/char/float/double数据不含有这些表示关系的部分,所以不能算做一种特殊的数据结构。
最后,“数组”确实是一个令人头疼的概念,不过我觉得应该把他算作数据结构的一种。依然先从定义上来看,他确实描述了一种关系,只不过刚好描述的数据一个挨一个紧密排列的关系;从实际结构上来说,我和陈岩看法不同,单个char/int确实和数组一样内存上连续,但两个char间不一定是连续的,但数组中却一定是连续的,数组描述的正是这种紧密连续的数据结构数组在内存中储存时也有末尾的多余部分“\0”来描述“结束”这一关系。(关于数组,一楼狼大人的叙述更精确)
3.二者的结合
个人觉得,数据类型偏向于用途用法方面,比如整型我用来计算,做加减乘除,字符串我用来表示文字信息,可以截取,拼接;数据结构偏向其内部原理,如链表的实现链式存储,队列用来保存待处理的数据等;就说数组吧,我写int[10] arr_data;的时候,我说arr_data是一个数组,这里的数组是说的是数据类型,我说这些数据用一个数组做成线性表存储的时候,这里的数组说的是数据结构。
4本质论道
数据本质上是没有类型的。我们都知道,数据在存储上是一堆01的数字,有时候我们要拿4个字节(int),有时候要拿1个字节(char),有时候又是8个字节(double);又有时候我们要拿第一个存进去的(FIFO),或者拿最新放进去的(LIFO),有时候又要拿最大的、最小的(heap),等等等。所以,数据结构是对数据的一种操作方式,定义了如何存取就定义了数据结构。至于数据类型?whocare?你爱叫阿猫阿狗都可以。数据类型只是一个名称,它既可以包含在数据结构里,又可以命名数据结构。
5.那么数组到底是一种数据结构还是一种数据类型呢?
数组只是个名称,它可以描述一组操作,也可以命名这组操作。数组的数据操作,是通过index-->value来实现的。它不是具体要求内存上要存储着连续的数据才叫数据,而是说,通过连续的索引index,我可以访问相邻的数据。具体可参考c的数组实现、php的数组实现......是不是除了线性表、队列、堆栈、树......这些,intchardouble也可以看成一种简单的只有一个数据元素的数据结构呢?是的,还是那句话,你定义了数据的存取你就定义了数据结构。
6.终极定论
数据类型(data type) =接口(interface) +数据的表示(data representation)数据表示有多种,数据结构(data structural representation)的表示形式是其中一种.EssentialofProgrammingLanguages,3rdEdition(豆瓣)第二章讲的应该就是这个了.
在计算机高级语言里,先有数据结构才有数据类型的,这里的数据结构与我们日常对数据的感觉不太一样(因为数据结构是科学家们人为地以计算效率和质量为目标设计的),是用来确定组织数据的逻辑结构(也就是用来确定我们操作这些数据的命令——最终转化成计算机指令)和物理结构(也就是确定那些操作命令的对象放在计算机内存中哪里了,以及以何种形式存在的)。
至于数据类型,就是为了更好地将人对数据的感知与计算机语言表示的数据对接起来而建立的概念,将性质相似的一些数据放在一起称为一类,这些数据可接受的操作命令是一样的,将它们归为一类也更便于数据的定义和操作、减少操作命令,也就有了数据类型产生的必要。而这些数据接受的操作命令本质上还是由表示该数据的数据结构定义的(至于数据的操作命令如何被执行的,在某种操作命令被创造的时候就已经被定义好了,只要你下达了某个操作命令,程序自然就会调用计算机指令(一个或者一系列)来执行这一命令,当然被操作的数据是以某种形式(包括物理上的和逻辑上的)存放在计算机内存中的,编程人不需要时刻关心这些,一般人也不会关心这些)
php 数组字符串转数组

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。