首先什么是抽象数据类型,抽象数据类型泛指除基本数据类型以外的数据类型。什么叫类型?就是一类数据。基本数据类型被认做是最基本地,不可再划分的数据,一般就是整形、浮点型、以及字符型。抽象数据类型是由若干基本数据类型归并之后形成的一种新的数据类型,这种类型由用户定义,功能操作比基本数据类型更多,一般包括结构体和类。其实说白了,抽象数据类型就是把一些有一定关联的基本数据类型打包,然后当做新的数据类型使用。
由上可知,我认为抽象数据类型的定义方法就是结构体和类的定义方法。
2.怎样写一个抽象数据类型template 这是定义类模版
因为C语言的函数参数传递需要指定确定类型才行。这样在编写程序过程就比较麻烦。比如
要写一个两个数相加的函数 int add(int a,int b),可以看到,这个函数只支持int 类型,float,double等类型就不能用这个函数了,只能再写一个 float addf(float a,float b)。这样代码的重用性能不好。
到了C++就有模版的出现了
就是定义一个模版,传入参数类型是不定时,就可以定义为模版。
你的代码就是了,template class T是任意的类型。
这样需要说明的是,模版的类型转换过程是发生在编译之前,也就是预编译,预编译跟预处理不同,预处理纯粹是编译前宏代码的替换,预编译是开始编译后,对一些模版类型进行调整生成中间代码,当然还有其它一些工作。
当编译成目标文件后,模版在定义变量赋了什么类型就是什么类型了
3.抽象数据类型定义有哪些内容抽象数据类型 与机器语言、汇编语言相比,高级语言的出现大大地简便了程序设计。
但算法从非形式的自然语言表达到形式化的高级语言表达,仍然是一个复杂的过程,仍然要做很多繁杂琐碎的事情,因而仍然需要抽象。 对于一个明确的数学问题,设计它的算法,总是先选用该问题的一个数据模型。
接着,弄清该问题所选用的数据模型在已知条件下的初始状态和要求 的结果状态,以及隐含着的两个状态之间的关系。然后探索从数据模型的已知初始状态出发到达要求的结果状态所必需的运算步骤。
把这些运算步骤记录下来,就是 该问题的求解算法。 按照自顶向下逐步求精的原则,我们在探索运算步骤时,首先应该考虑算法顶层的运算步骤,然后再考虑底层的运算步骤。
所谓顶层的运算步骤是指定义在数 据模型级上的运算步骤,或叫宏观运算。它们组成算法的主干部分。
表达这部分算法的程序就是主程序。其中涉及的数据是数据模型中的一个变量,暂时不关心它的 数据结构;涉及的运算以数据模型中的数据变量作为运算对象,或作为运算结果,或二者兼而为之,简称为定义在数据模型上的运算。
由于暂时不关心变量的数据结 构,这些运算都带有抽象性质,不含运算的细节。所谓底层的运算步骤是指顶层抽象的运算的具体实现。
它们依赖于数据模型的结构,依赖于数据模型结构的具体表 示。因此,底层的运算步骤包括两部分:一是数据模型的具体表示;二是定义在该数据模型上的运算的具体实现。
我们可以把它们理解为微观运算。于是,底层运算 是顶层运算的细化;底层运算为顶层运算服务。
为了将顶层算法与底层算法隔开,使二者在设计时不会互相牵制、互相影响,必须对二者的接口进行一次抽象。让底 层只通过这个接口为顶层服务,顶层也只通过这个接口调用底层的运算。
这个接口就是抽象数据类型。其英文术语是Abstract Data Types,简记ADT。
抽象数据类型是算法设计和程序设计中的重要概念。严格地说,它是算法的一个数据模型连同定义在该模型上、作为该算法构件的一组运算。
这个概念明确地 把数据模型与作用在该模型上的运算紧密地联系起来。 事实正是如此。
一方面,如前面指出过的,数据模型上的运算依赖于数据模型的具体表示,因为数据模型上的 运算以数据模型中的数据变量作为运算对象,或作为运算结果,或二者兼而为之;另方面,有了数据模型的具体表示,有了数据模型上运算的具体实现,运算的效率 随之确定。 于是,就有这样的一个问题:如何选择数据模型的具体表示使该模型上的各种运算的效率都尽可能地高?很明显,对于不同的运算组,为使组中所有运算 的效率都尽可能地高,其相应的数据模型具体表示的选择将是不同的。
在这个意义下,数据模型的具体表示又反过来依赖于数据模型上定义的那些运算。 特别是,当 不同运算的效率互相制约时,还必须事先将所有的运算的相应使用频度排序,让所选择的数据模型的具体表示优先保证使用频度较高的运算有较高的效率。
数据模型 与定义在该模型上的运算之间存在着的这种密不可分的联系,是抽象数据类型的概念产生的背景和依据。 应该指出,抽象数据类型的概念并不是全新的概念。
它实际上是我们熟悉的基本数据类型概念的引伸和发展。用过高级语言进行算法设计和程序设计的人都知 道,基本数据类型已隐含着数据模型和定义在该模型上的运算的统一,只是当时还没有形成抽象数据类型的概念罢了。
事实上,大家都清楚,基本数据类型中的逻辑 类型就是逻辑值数据模型和或(∨)、与(∧)、非(┐)三种逻辑运算的统一体;整数类型就是整数值数据模型和加(+)、减(-)、乘(*)、除(div) 四种运算的统一体;实型和字符型等也类同。每一种基本类型都连带着一组基本运算。
只是由于这些基本数据类型中的数据模型的具体表示和基本运算的具体实现都 很规范,都可以通过内置(built-in)而隐蔽起来,使人们看不到它们的封装。许多人已习惯于在算法与程序设计中用基本数据类型名和相关的运算名,而 不问其究竟。
所以没有意识到抽象数据类型的概念已经孕育在基本数据类型的概念之中。 回到定义算法的顶层和底层的接口,即定义抽象数据类型。
根据抽象数据类型的概念,对抽象数据类型进行定义就是约定抽象数据类型的名字,同时,约定在 该类型上定义的一组运算的各个运算的名字,明确各个运算分别要有多少个参数,这些参数的含义和顺序,以及运算的功能。 一旦定义清楚,算法的顶层就可以像引 用基本数据类型那样,十分简便地引用抽象数据类型;同时,算法的底层就有了设计的依据和目标。
顶层和底层都与抽象数据类型的定义打交道。顶层运算和底层运 算没有直接的联系。
因此,只要严格按照定义办,顶层算法的设计和底层算法的设计就可以互相独立,互不影响,实现对它们的隔离,达到抽象的目的。 在定义了抽象数据类型之后,算法底层的设计任务就可以明确为: 赋每一个抽象数据类型名予具体的构造数据类型,或者说,赋每一个抽象数据类型名予具体的数据结构; 赋每一个抽象数据类型上的每个运算名予具体的运算内容,或者说,赋予具。
4.仿照三元组的抽象数据类型分别写出抽象数据类型复数的定义1.1
试仿照三元组的抽象数据类型分别写出抽象数据类型复数的定义。
1.2
设
n
为正整数,试确定下列各程序段中前置以记号
#
的语句的频度。
1.
i=1;k=0;
While (i{ #
k+=10*i;
i++;}
2.
i=1;k=0;
do { #
k+=10*i;
i++;} While (i3. i=1;k=0;
While (i{ i++;
#
k+=10*i; }
4. k=0;
for(i=1;i
{ for(j=i;j# k++;
}
5. for(i=1;i
for(j=1;j
for(k=1;k# x+=delta;;
6. i=1;j=0;
While (i+j{ # if (i>j)
j++;
else i++; }
7. x=n; y=0;
While (x>=(y+1)*(y+1))
{ #
y++; }
8. x=91; y=100;
While (y>0)
{ #
if (x>100) { x-=10; y--; }
else x++;
}
1.3
试写一算法,自大至小依次输出顺序读入的三个整数
X
、
Y
和
Z
的值