更新時間:2023年11月23日14時05分 來源:傳智教育 瀏覽次數(shù):
抽象數(shù)據(jù)類型(Abstract DataType,ADT)是指一個數(shù)學(xué)模型以及定義在這個模型上的一組操作。抽象數(shù)據(jù)類型的定義僅僅取決于它的一組邏輯特性,而與它在計算機(jī)中的表示和實現(xiàn)無關(guān)。
抽象數(shù)據(jù)類型有兩個重要特征:數(shù)據(jù)抽象和數(shù)據(jù)封裝。
所謂數(shù)據(jù)抽象是指用ADT描述程序處理的實體時,強(qiáng)調(diào)的是其本質(zhì)的特征,無論內(nèi)部結(jié)構(gòu)如何變化,只要本質(zhì)特性不變,就不影響其外部使用。例如,在程序設(shè)計語言中經(jīng)常使用的數(shù)據(jù)類型int,它就可以理解為是一個抽象數(shù)據(jù)類型,在不同的計算機(jī)或操作系統(tǒng)中,它的實現(xiàn)方式可能會有所不同,但它本質(zhì)上的數(shù)學(xué)特性是保持不變的。例如,int類型的數(shù)據(jù)指的是整數(shù),可以進(jìn)行加減乘除模等一些運(yùn)算,int類型數(shù)據(jù)的這些數(shù)學(xué)特性保持不變,那么在編程者來看,它們都是相同的。因此數(shù)據(jù)抽象的意義在于數(shù)據(jù)類型的數(shù)學(xué)抽象特性。
而另一方面,所謂的數(shù)據(jù)封裝是指用戶在軟件設(shè)計時從問題的數(shù)學(xué)模型中抽象出來的邏輯數(shù)據(jù)結(jié)構(gòu)和邏輯數(shù)據(jù)結(jié)構(gòu)上的運(yùn)算,需要通過固有數(shù)據(jù)類型(高級編程語言中已實現(xiàn)的數(shù)據(jù)類型)來實現(xiàn),它在定義時必須給出名字及其能夠進(jìn)行的運(yùn)算操作。一旦定義了一個抽象數(shù)據(jù)類型,程序設(shè)計中就可以像使用基本數(shù)據(jù)類型那樣來使明它。例如,在統(tǒng)計學(xué)生信息時,經(jīng)常會使用姓名、學(xué)號、成績等信息,可以定義一個抽象數(shù)據(jù)類型student,它封裝了姓名、學(xué)號、成績3個不同類型的變量,這樣操作student的變量就能很方便地知道這些信息了。C語言中的結(jié)構(gòu)體以及C++語言中的類等都是這種形式。
抽象數(shù)據(jù)類型在定義時遵循一定的格式規(guī)范,一般抽象數(shù)據(jù)類型的定義格式如下所示:
ADT抽象數(shù)據(jù)類型名 { Data: 數(shù)據(jù)元素之間邏輯關(guān)系的定義; Operation: 操作1; 操作2; }
使用它的人可以只關(guān)心它的邏輯特征,不需要了解它的存儲方式。定義它的人同樣不必關(guān)心它如何存儲。
抽象數(shù)據(jù)類型的定義由一個值域(Data)和定義在該值域上的一組操作(Operation)組成,若按其值的不同特性,可將抽象數(shù)據(jù)類型細(xì)分為3類:
(1)原子類型。這種類型的變量,值是不可分解的。例如int、char等這些數(shù)據(jù)類型就無法再分解,屬于原子類型的數(shù)據(jù)類型。一般較少定義這種抽象數(shù)據(jù)類型,因為固有數(shù)據(jù)類型基本都能滿足程序設(shè)計。
(2)固定聚合類型。這種抽象數(shù)據(jù)類型,其值是由確定數(shù)目的成分按一定的結(jié)構(gòu)組成的。例如,以上提到的student抽象數(shù)據(jù)類型由姓名、學(xué)號、成績3個成分按照先后順序組成。
(3)可變聚合類型。與固定聚合類型相比,構(gòu)成可變聚合類型值的成分的數(shù)目不確定。例如,定義一個“字符序列”,其中序列長度是可變的,我們并不知道會有多少個字符來組成這個序列。
抽象數(shù)據(jù)類型可以更好地使程序設(shè)計模塊化,在模塊內(nèi)部給出這些數(shù)據(jù)的表示及其操作的細(xì)節(jié),在模塊外部使用抽象的數(shù)據(jù)和抽象的操作。而且,所定義的數(shù)據(jù)類型的抽象層次越高,含有該抽象數(shù)據(jù)類型的軟件模塊的復(fù)用程度也就越高。