本文目錄一覽:
抽象數據類型
類的基礎:抽象數據類型抽象數據類型(ADT, abstract data type)是指一些數據以及對這些數據所進行的操作的集合。這些操作既向程序的其餘部分描述了這些數據是怎麼樣的,也允許程序的其餘部分改變這些數據。“抽象數據類型”概念中“數據”一詞的用法有些隨意。一個ADT可能是一個圖形窗體以及所有能影響該窗體的操作;也可以是一個文件以及對這個文件進行的操作;或者是一張保險費率表以及相關操作等等。要想理解面向對象編程,首先要理解ADT。不懂ADT的程序員開發出來的類只是名義上的“類”而已——實際上這種“類”只不過就是把一些稍有點兒關係的數據和子程序堆在一起。然而在理解ADT之後,程序員就能寫出在一開始很容易實現、日後也易於修改的類來。傳統的編程教科書在講到抽象數據類型時,總會用一些數學中的事情打岔。這些書往往會像這麼寫:“你可以把抽象數據類型想成一個定義有一組操作的數學模型。”這種書會給人一種感覺,好像你從不會真正用到抽象數據類型似的——除非拿它來催眠。把抽象數據類型解釋得這麼空洞是完全丟了重點。抽象數據類型可以讓你像在現實世界中一樣操作實體,而不必在低層的實現上擺弄實體,這多令人興奮啊。你不用再向鏈表中插入一個節點了,而是可以在電子表格中添加一個數據單元格,或向一組窗體類型中添加一個新類型,或給火車模型加掛一節車廂。深入挖掘能在問題領域工作(而非在底層實現領域工作)的能量吧!Example of the Need for an ADT需要用到ADT的例子為了展開討論,這裡先舉一個例子,看看ADT在什麼情況下會非常有用。有了例子之後我們將繼續深入細節探討。假設你正在寫一個程序,它能用不同的字體、字號和文字屬性(如粗體、斜體等)來控制顯示在屏幕上的文本。程序的一部分功能是控制文本的字體。如果你用一個ADT,你就能有捆綁在相關數據上的一組操作字體的子程序——有關的數據包括字體名稱、字號和文字屬性等。這些子程序和數據集合為一體,就是一個ADT。如果不使用ADT,你就只能用一種拼湊的方法來操縱字體了。舉例來說,如果你要把字體大小改為12磅(point),即高度碰巧為16個像素(pixel),你就要寫類似這樣的代碼:currentFont.size = 16如果你已經開發了一套子程序庫,那麼代碼可能會稍微好看一些:currentFont.size = PointsToPixels(12)或者你還可以給該屬性起一個更特定的名字,比如說:currentFont.sizeOnPixels = PointsToPixels(12)但你是不能同時使用currentFont.sizeInPixels和currentFont.sizeInPoints,因為如果同時使用這兩項數據成員,currentFont就無從判斷到底該用哪一個了。而且,如果你在程序的很多地方都需要修改字體的大小,那麼這類語句就會散布在整個程序之中。如果你需要把字體設為粗體,你或許會寫出下面的語句,這裡用到了一個邏輯or運算符和一個16進制常量0x02:currentFont.attribute = CurrentFont.attribute or 0x02如果你夠幸運的話,也可能代碼會比這樣還要乾淨些。但使用拼湊方法的話,你能得到的最好結果也就是寫成這樣:currentFont.attribute = CurrentFont.attribute or BOLD或者是這樣:currentFont.bold = True就修改字體大小而言,這些做法都存在一個限制,即要求調用方代碼直接控制數據成員,這無疑限制了currentFont的使用。如果你這麼編寫程序的話,程序中的很多地方就會到處充斥着類似的代碼。Benefits of Using ADTs使用ADT的益處問題並不在於拼湊法是種不好的編程習慣。而是說你可以採用一種更好的編程方法來替代這種方法,從而獲得下面這些好處:可以隱藏實現細節 把關於字體數據類型的信息隱藏起來,意味着如果數據類型發生改變,你只需在一處修改而不會影響到整個程序。例如,除非你把實現細節隱藏在一個ADT中,否則當你需要把字體類型從粗體的第一種表示變成第二種表示時,就不可避免地要更改程序中所有設置粗體字體的語句,而不能僅在一處進行修改。把信息隱藏起來能保護程序的其餘部分不受影響。即使你想把在內存里存儲的數據改為在外存里存儲,或者你想把所有操作字體的子程序用另一種語言重寫,也都不會影響程序的其餘部分。
改動不會影響到整個程序 如果想讓字體更豐富,而且能支持更多操作(例如變成小型大寫字母、變成上標、添加刪除線等)時,你只需在程序的一處進行修改即可。這一改動也不會影響到程序的其餘部分。讓接口能提供更多信息 像currentFont.size = 16這樣的語句是不夠明確的,因為此處16的單位既可能是像素也可能是磅。語句所處的上下文環境並不能告訴你到底是哪一種單位。把所有相似的操作都集中到一個ADT里,就可以讓你基於磅數或像素數來定義整個接口,或者把二者明確地區分開,從而有助於避免混淆。更容易提高性能 如果你想提高操作字體時的性能,就可以重新編寫出一些更好的子程序,而不用來回修改整個程序。讓程序的正確性更顯而易見 驗證像currentFont.attribute = current-
Font.attribute or 0x02這樣的語句是否正確是很枯燥的,你可以替換成像currentFont.SetBoldOn()這樣的語句,驗證它是否正確就會更容易一些。對於前者,你可能會寫錯結構體或數據項的名字,或者用錯運算符(用了and而不是or),也可能會寫錯數值(寫成了0x20而不是0x02)。但對於後者,在調用current-
Font.SetBoldOn()時,唯一可能出錯的地方就是寫錯方法(成員函數)名字,因此識別它是否正確就更容易一些。程序更具自我說明性 你可以改進像currentFont.attribute or 0x02這樣的語句——把0x02換成BOLD或“0x02所代表的具體含義”,但無論怎樣修改,其可讀性都不如currentFont.SetBoldOn()這條語句。Woodfield、Dunsmore和Shen曾做過這樣一項研究,他們讓一些計算機科學專業的研究生和高年級本科生回答關於兩個程序的問題:第一個程序按功能分解為8個子程序,而第二個程序分解為抽象數據類型中的8個子程序(1981)。結果,按那些使用抽象數據類型程序的學生的得分比使用按功能劃分的程序的學生高出超過30%。無須在程序內到處傳遞數據 在剛才那個例子里,你必須直接修改current-
Font的值,或把它傳給每一個要操作字體的子程序。如果你使用了抽象數據類型,那麼就不用再在程序里到處傳遞currentFont了,也無須把它變成全局數據。ADT中可以用一個結構體來保存currentFont的數據,而只有ADT里的子程序才能直接訪問這些數據。ADT之外的子程序則不必再關心這些數據。你可以像在現實世界中那樣操作實體,而不用在底層實現上操作它 你可以定義一些針對字體的操作,這樣,程序的絕大部分就能完全以“真實世界中的字體”這個概念來操作,而不再用數組訪問、結構體定義、True與False等這些底層的實現概念了。這樣一來,為了定義一個抽象數據類型,你只需定義一些用來控制字體的子程序——多半就像這樣:currentFont.SetSizeInPoints(sizeInPoints)currentFont.SetSizeInPixels(sizeInPixels)currentFont.SetGBoldOn()currentFont.SetBoldOff()currentFont.SetItalicOn()currentFont.SetItalicOff()currentFont.SetTypeFace(faceName)這些子程序里的代碼可能很短——很可能就像你此前看到的那個用拼湊法控制字體時所寫的代碼。這裡的區別在於,你已經把對字體的操作都隔離到一組子程序里了。這樣就為需要操作字體的其他部分程序提供了更好的抽象層,同時它也可以在針對字體的操作發生變化時提供一層保護。
在數據結構里,什麼是抽象數據類型
1、象數據類型(Abstract Data Type 簡稱ADT)是指一個數學模型以及定義在此數學模型上的一組操作。
2、抽象數據類型需要通過固有數據類型(高級編程語言中已實現的數據類型)來實現。
3、抽象數據類型是與表示無關的數據類型,是一個數據模型及定義在該模型上的一組運算。
4、對一個抽象數據類型進行定義時,必須給出它的名字及各運算的運算符名,即函數名,並且規定這些函數的參數性質。一旦定義了一個抽象數據類型及具體實現,程序設計中就可以像使用基本數據類型那樣,十分方便地使用抽象數據類型。
計算機語言中數據類型具體包括哪些
數據類型在數據結構中的定義是一個值的集合以及定義在這個值集上的一組操作。變量是用來存儲值的所在處,它們有名字和數據類型。變量的數據類型決定了如何將代表這些值的位存儲到計算機的內存中。在聲明變量時也可指定它的數據類型。所有變量都具有數據類型,以決定能夠存儲哪種數據。
數據類型包括原始類型、多元組、記錄單元、代數數據類型、抽象數據類型、參考類型以及函數類型。
求《數據結構與算法Python語言描述》全文免費下載百度網盤資源,謝謝~
《數據結構與算法Python語言描述》百度網盤pdf最新全集下載:
鏈接:
?pwd=jdjq 提取碼: jdjq
簡介:數據結構與算法Python語言描述基於Python語言介紹了數據結構與算法的基本知識,主要內容包括抽象數據類型和Python面向對象程序設計、線性表、字符串、棧和隊列、二叉樹和樹、集合、排序以及算法的基本知識。本書延續問題求解的思路,從解決問題的目標來組織教學內容,注重理論與實踐的並用。
什麼是抽象數據類型?
抽象數據類型需要通過固有數據類型(高級編程語言中已實現的數據類型)來實現。
比如說類 就是 一種抽象數據類型,類是由已有的數據類型 來實現的。
如複數類型:
//在頭文件complex.h中定義的複數類
#ifndef _complex_h_
#define _complex_h_
#include iostream.h
class complex {
public:
complex ( ){ Re = Im = 0; } //不帶參數的構造函數
complex ( double r ) { Re = r; Im = 0; } //只置實部的構造函數
complex ( double r, double i ) { Re = r; Im = i; } //分別置實部、虛部的構造函數
double getReal ( ) { return Re; } //取複數實部
double getImag ( ) { return Im; } //取複數虛部
void setReal ( double r ) { Re = r; } //修改複數實部
void setImag ( double i ) { Im = i; } //修改複數虛部
complex operator = ( complex ob) { Re = ob.Re; Im = ob.Im; } //複數賦值
complex operator + ( complex ob ); //重載函數:複數四則運算
complex operator – ( complex ob );
complex operator * ( complex ob );
complex operator / ( complex ob );
friend ostream operator ( ostream os, complex c ); //友元函數:重載
private:
double Re, Im; //複數的實部與虛部
};
#endif
//複數類complex的相關服務的實現放在C++源文件complex.cpp中
#include iostream.h
#include math.h
#include “complex.h”
complex complex :: operator + ( complex ob ) {
//重載函數:複數加法運算。
complex * result = new complex ( Re + ob.Re, Im + ob.Im );
return *result;
}
complex complex :: operator – ( complex ob ) {
//重載函數:複數減法運算
complex * result = new complex ( Re – ob.Re, Im – ob.Im );
return * result;
}
complex complex :: operator * ( complex ob ) {
//重載函數:複數乘法運算
complex * result =
new complex ( Re * ob.Re – Im * ob.Im, Im * ob.Re + Re * ob.Im );
return *result;
}
complex complex :: operator / ( complex ) {
//重載函數:複數除法運算
double d = ob.Re * ob.Re + ob.Im * ob.Im;
complex * result = new complex ( ( Re * ob.Re + Im * ob.Im ) / d,
( Im * ob. Re – Re * ob.Im ) / d );
return * result;
}
friend ostream operator ( ostream os, complex ob ) {
//友元函數:重載,將複數ob輸出到輸出流對象os中。
return os ob.Re ( ob.Im = 0.0 ) ? “+” : “-” fabs ( ob.Im ) “i”;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/277185.html