導航:首頁 > 數據處理 > 數組這種數據結構的特點有哪些

數組這種數據結構的特點有哪些

發布時間:2023-01-19 05:13:17

『壹』 什麼是對象數組有哪些特徵與要素

對象數組就是數組里的每個元素都是類的對象,賦值時先定義對象,然後將對象直接賦給數組。關於對象數組,以下是由我整理關於對象數組的內容,希望大家喜歡!

對象數組的介紹
(1)類

具有相同或相似性質的對象的抽象就是類。因此,對象的抽象是類,類的具體化就是對象,也可以說類的實例是對象。

類具有屬性,它是對象的狀態的抽象,用數據結構來描述類的屬性。

類具有操作,它是對象的行為的抽象,用操作名和實現該操作的 方法 來描述。

(2)類的結構

在客觀世界中有若干類,這些類之間有一定的結構關系。通常有兩種主要的結構關系,即一般--具體結構關系,整體--部分結構關系。

①一般——具體結構稱為分類結構,也可以說是“或”關系,或者是“is a”關系。

②整體——部分結構稱為組裝結構,它們之間的關系是一種“與”關系,或者是“has a”關系。

(3)對象

對象是人們要進行研究的任何事物,從最簡單的整數到復雜的飛機等均可看作對象,它不僅能表示具體的事物,還能表示抽象的規則、計劃或事件。

(4)對象的狀態和行為

對象具有狀態,一個對象用數據值來描述它的狀態。

對象還有操作,用於改變對象的狀態,對象及其操作就是對象的行為。

對象實現了數據和操作的結合,使數據和操作封裝於對象的統一體中

(5)消息和方法

對象之間進行通信的結構叫做消息。在對象的操作中,當一個消息發送給某個對象時,消息包含接收對象去執行某種操作的信息。發送一條消息至少要包括說明接受消息的對象名、發送給該對象的消息名(即對象名、方法名)。一般還要對參數加以說明,參數可以是認識該消息的對象所知道的變數名,或者是所有對象都知道的全局變數名。
對象數組的特徵
(1)對象唯一性

每個對象都有自身唯一的標識,通過這種標識,可找到相應的對象。在對象的整個生命期中,它的標識都不改變,不同的對象不能有相同的標識。

(2)分類性

分類性是指將具有一致的數據結構(屬性)和行為(操作)的對象抽象成類。一個類就是這樣一種抽象,它反映了與應用有關的重要性質,而忽略其他一些無關內容。任何類的劃分都是主觀的,但必須與具體的應用有關。

(3)繼承性

繼承性是子類自動共享父類數據結構和方法的機制,這是類之間的一種關系。在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並加入若干新的內容。

繼承性是面向對象程序設計語言不同於 其它 語言的最重要的特點,是其他語言所沒有的。

在類層次中,子類只繼承一個父類的數據結構和方法,則稱為單重繼承。

在類層次中,子類繼承了多個父類的數據結構和方法,則稱為多重繼承。

在軟體開發中,類的繼承性使所建立的軟體具有開放性、可擴充性,這是信息組織與分類的行之有效的方法,它簡化了對象、類的創建工作量,增加了代碼的可重性。

採用繼承性,提供了類的規范的等級結構。通過類的繼承關系,使公共的特性能夠共享,提高了軟體的重用性。

(4)多態性(多形性)

多態性使指相同的操作或函數、過程可作用於多種類型的對象上並獲得不同的結果。不同的對象,收到同一消息可以產生不同的結果,這種現象稱為多態性。

多態性允許每個對象以適合自身的方式去響應共同的消息。

多態性增強了軟體的靈活性和重用性。
對象數組的要素
(1)抽象

抽象是指強調實體的本質、內在的屬性。在系統開發中,抽象指的是在決定如何實現對象之前的對象的意義和行為。使用抽象可以盡可能避免過早考慮一些細節。

類實現了對象的數據(即狀態)和行為的抽象。

(2)封裝性(信息隱藏)

封裝性是保證軟體部件具有優良的模塊性的基礎。

面向對象的類是封裝良好的模塊,類定義將其說明(用戶可見的外部介面)與實現(用戶不可見的內部實現)顯式地分開,其內部實現按其具體定義的作用域提供保護。

對象是封裝的最基本單位。封裝防止了程序相互依賴性而帶來的變動影響。面向對象的封裝比傳統語言的封裝更為清晰、更為有力。

(3)共享性

面向對象技術在不同級別上促進了共享:

①同一類中的共享

同一類中的對象有著相同數據結構。這些對象之間是結構、行為特徵的共享關系。

②在同一應用中共享

在同一應用的類層次結構中,存在繼承關系的各相似子類中,存在數據結構和行為的繼承,使各相似子類共享共同的結構和行為。使用繼承來實現代碼的共享,這也是面向對象的主要優點之一。

③在不同應用中共享

面向對象不僅允許在同一應用中共享信息,而且為未來目標的可重用設計准備了條件。通過類庫這種機制和結構來實現不同應用中的信息共享。

『貳』 數據結構中經常對數組進行的兩種基本操作是什麼

數據結構中經常對數組進行的兩種基本操作是查找和修改。

數組是存儲於一個連續存儲空間中的相同數據類型的數據元素集合,通過數組元素的下標(位置序號),就可以找到存放該數組元素的存儲地址,從而可以訪問該數組元素的值。它通常用於實現順序表,通常包括查找和修改運算。

(2)數組這種數據結構的特點有哪些擴展閱讀:

不過要注意的是,順序表是一個一維數組,而多維數組則是典型的非線性結構。另外值得說明的是,數組的特點是:

1、數組元素的數目固定,一旦定義了數組,就不再有元素的增減變化。

2、數據元素具有相同的類型。

3、數組的下標關系具有上下界的約束且下標有序。因此,數組一般不做插入和刪除操作。

『叄』 線性的數據結構有哪幾種各有什麼特點

線性的數據結構有:線性表、棧、隊列、雙端隊列、數組和串

1、線性表

線性表是最基本、最簡單、也是最常用的一種數據結構。一個線性表是n個具有相同特性的數據元素的有限序列。

特點:線性表中數據元素之間的關系是一對一的關系;線性表的邏輯結構簡單,便於實現和操作。

2、棧

棧又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。棧是限定僅在表頭進行插入和刪除操作的線性表。

特點:棧是允許在同一端進行插入和刪除操作的特殊線性表,棧可以用來在函數調用的時候存儲斷點,做遞歸時要用到棧。

3、隊列

隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。

特點:在隊列的形成過程中,可以利用線性鏈表的原理,來生成一個隊列;隊列和棧一樣只允許在斷點處插入和刪除元素。

4、雙端隊列

雙端隊列是指允許兩端都可以進行入隊和出隊操作的隊列,其元素的邏輯結構仍是線性結構。將隊列的兩端分別稱為前端和後端,兩端都可以入隊和出隊。

特點:對於雙端隊列,在序列的兩端插入元素的時間復雜度均為常數,在中間插入元素的時間復雜度與插入點到最近序列端點的距離成正比。

5、數組

數組是用於儲存多個相同類型數據的集合。若將有限個類型相同的變數的集合命名,那麼這個名稱為數組名。組成數組的各個變數稱為數組的分量,也稱為數組的元素,有時也稱為下標變數。

特點:數組中的各元素的存儲是有先後順序的,它們在內存中按照這個先後順序連續存放在一起;數組元素用整個數組的名字和它自己在數組中的順序位置來表示。

6、串

串是零個或多個字元組成的有限序列。一般記S=『a1a2....an 』其中,S是串名,單引號括起的字元序列是串值;ai(1〈=i〈=n)可以是字母,數字或其它字元。

特點:串中所包含的字元個數為該串的長度;長度為零的串稱為空串,它不包含任何字元。

『肆』 數組數據結構的優點! 在線等待

必須A啊!
數組一般不做插入刪除操作,一旦建立,元素之間的關系不再變動,排除BC,
對於D,數組和廣義表都可以看成是線性表,是一對一的邏輯結構,因此對於樹、圖、這樣一對多、多對多的邏輯結構不能方便表示。

『伍』 8種數據結構

常見的8種數據結構:數組、鏈表、棧、隊列、樹、堆、圖、哈希表
1.數組:
優點:按照索引查詢元素的速度很快
缺點:數組的大小在創建後就確定了,不方便擴容;數組只能存儲一種類型的數據;添加,刪除元素的操作很耗時間,因為要移動其他元素

2.鏈表:
優點:鏈表在插入,刪除的時候可以達到O(1)的時間復雜度並且鏈表克服了數組必須預先知道數據大小的缺點,從而可以實現靈活的內存動態管理
缺點:含有其他結點的引用,佔用內存空間大;查找元素需要遍歷整個鏈表,耗時。

3.棧
棧按照「先進後出」的原則來存儲數據,先插入的數據被壓入棧底,後插入的數據在棧頂,讀出數據的時候,從棧頂開始依次讀出。

4.隊列
與棧不同,隊列對兩端進行定義,一端叫隊頭,另外一端就叫隊尾。隊頭只允許刪除操作(出隊),隊尾只允許插入操作(入隊)。

5.樹
<1>.二叉樹:每個節點最多含有兩個子樹,按照左右不同的表現形式又可以分為多種。
<2>完全二叉樹:對於一顆二叉樹,假設其深度為d.除了第d層,其它各層的節點數目均已達最大值,且第d層所有節點從左向右連續的緊密排列
<3>滿二叉樹:一顆每一層的節點數都達到了最大值的二叉樹。

:對於二叉查找樹中的任意一個節點如果左子樹不為空,那麼左子樹上所有節點的值均小於它的根節點的值;如果右子樹不空,右子樹上所有節點的值均大於它的根節點的值。
基於二叉樹的特點,它相比較與其它數據結構的優勢在於查找、插入的時間復雜度比較低,為O(logn)。

:平衡二叉樹本質上也是一顆二叉查找樹,不同的是該樹中任意節點的兩顆子樹的高度差不大於1
註:平衡二叉樹的難點在於,當刪除或者增加節點的情況下,如何通過左旋或者右旋的方式來保持左右平衡。
java中最常見的平衡二叉樹就是紅黑樹,它具有以下特點:
(1)每個節點都只能是紅色或者黑色
(2)根節點是黑色
(3)每個葉節點是黑色的
(4)如果一個節點是紅色的,則它兩個子節點點都是黑色的。也就是說在一條路徑上不能出現相鄰的兩個紅色節點
(5)從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點

:一種對讀寫操作進行優化的自平衡的二叉查找樹,能夠保持數據有序,擁有多於兩個的子樹。

6. :堆可以被看作是一棵樹的數組對象,具有以下特點:
(1)堆中某個節點的值總是不大於或不小於其父節點的值
(2)堆總是一顆完全二叉樹
將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆

7. :由頂點的有窮非空集合和頂點之間邊的集合組成

8. :是一種可以通過關鍵碼值(key-value)直接訪問的數據結構,它最大的特點就是結合了數組和鏈表的優點可以快速實現查找、插入和刪除。
哈希函數在哈希表中起著非常關鍵的作用, ,該輸出就是哈希值。

哈希表是是通過數組來實現的,首先對key值進行hash演算法得到一個數,然後對該數進行定址演算法計算,得到一個數組中的下標,通過該下標對數據進行存取,解決地址沖突常用方法有鏈表法。Java里的HashMap使用的是鏈表法。

『陸』 八種數據結構特點

數據結構:計算機存儲、組織數據的方式。程序員的目標是為當前的問題選擇最優的數據結構。

八種數據結構:數組,棧,鏈表,隊列,堆,圖,樹,散列表,每種數據結構都有其特殊的存儲方式。

概念:

一維數組:數組元素+數組索引

多維數組:數組的元素也是數組

基本操作:insert,get,delete(刪除某個索引處的數組),size(獲取數組長度)

題目:

查找數組第二小的元素

查找第一個沒有重復的數組元素

合並2個排序號的數據

重新排列數組中的正數和負數

特點:棧是一種特殊的線性表,僅能在線性表的一端操作,棧頂允許操作,棧底不允許操作。 棧的特點是:先進後出,或者說是後進先出。棧中的元素採用LIFO (Last In First Out),即後進先出。

基本操作:Push(棧頂插入元素),Pop(返回棧最上方的元素,並刪除),isEmpty(查詢棧是否為空),Top(返回最上方元素,並不刪除)

題目:使用棧計算後綴表達式、使用棧為棧中的元素排序、檢查字元串中的括弧是否匹配正確

使用場景:棧常應用於實現遞歸功能方面的場景,例如斐波那契數列。撤回,即Ctrl+Z,是我們最常見的操作之一,大多數應用都會支持這個功能。你知道它是怎麼實現的嗎?答案是這樣的:把之前的應用狀態(限制個數)保存到內存中,最近的狀態放到第一個。這時,我們需要棧(stack)來實現這個功能。

概念:隊列(Queue)與棧類似,都是採用線性結構存儲數據。它們的區別在於,棧採用LIFO方式,而隊列採用先進先出,即FIFO(First in First Out)。

使用場景:因為隊列先進先出的特點,在多線程阻塞隊列管理中非常適用。

基本操作:Enqueue—在隊列末尾插入元素,Dequeue—將隊列第一個元素刪除i,sEmpty—查詢隊列是否為空,Top—返回隊列的第一個元素

習題:使用隊列實現棧,倒轉隊列的前K個元素,使用隊列將1到n轉換為二進制。

概念「鏈表(Linked List)也是線性結構,它與數組看起來非常像,但是它們的內存分配方式、內部結構和插入刪除操作方式都不一樣。鏈表是一系列節點組成的鏈,每一個節點保存了數據以及指向下一個節點的指針。鏈表頭指針指向第一個節點,如果鏈表為空,則頭指針為空或者為null。鏈表分為:單向鏈表,雙向鏈表。

使用場景:鏈表可以用來實現文件系統、哈希表和鄰接表。

基本操作:InsertAtEnd—在鏈表結尾插入元素,InsertAtHead—在鏈表開頭插入元素,Delete—刪除鏈表的指定元素,DeleteAtHead—刪除鏈表第一個元素,Search—在鏈表中查詢指定元素,isEmpty—查詢鏈表是否為空

題目:倒轉1個鏈表,檢查鏈表中是否存在循環,返回鏈表倒數第N個元素,移除鏈表中的重復元素

概念:圖(graph)由多個節點(vertex)構成,節點之間闊以互相連接組成一個網路。(x, y)表示一條邊(edge),它表示節點x與y相連。邊可能會有權值(weight/cost)。

分類:無向圖,有向圖

表現形式:鄰接矩陣(Adjacency Matrix),鄰接表(Adjacency List)

遍歷圖的兩種演算法:廣度優先搜索(Breadth First Search),深度優先搜索(Depth First Search)

常見題目:

實現廣度優先搜索,實現深度優先搜索,檢查圖是否為樹,統計圖中邊的個數,使用Dijkstra演算法查找兩個節點之間的最短距離。

樹(Tree)是一個分層的數據結構,由節點和連接節點的邊組成。樹是一種特殊的圖,它與圖最大的區別是沒有循環。樹被廣泛應用在人工智慧和一些復雜演算法中,用來提供高效的存儲結構。

常見樹:N叉樹(N-ary Tree),平衡樹(Balanced Tree),二叉樹(Binary Tree),二叉查找樹(Binary Search Tree),平衡二叉樹(AVL Tree),紅黑樹(Red Black Tree),2-3樹(2–3 Tree)

題目:計算樹的高度,查找二叉平衡樹中第K大的元素,查找樹中與根節點距離為k的節點,查找二叉樹中某個節點所有祖先節點。

哈希(Hash)將某個對象變換為唯一標識符,該標識符通常用一個短的隨機字母和數字組成的字元串來代表。哈希可以用來實現各種數據結構,其中最常用的就是哈希表(hash table)。

哈希表通常由數組實現。

哈希表的性能取決於3個指標:

哈希函數哈希表的大小哈希沖突處理方式

題目:查找數組中對稱的組合,確認某個數組的元素是否為另一個數組元素的子集,確認給定的數組是否互斥。

前綴樹(Prefix Trees或者Trie) 與樹類似,用於處理字元串相關的問題時非常高效。它可以實現快速檢索,常用於字典中的單詞查詢,搜索引擎的自動補全甚至IP路由。

參考資料: http://www.cnblogs.com/williamjie/p/9558015.html

『柒』 對象數組的特徵

(1)對象唯一性
每個對象都有自身唯一的標識,通過這種標識,可找到相應的對象。在對象的整個生命期中,它的標識都不改變,不同的對象不能有相同的標識。
(2)分類性
分類性是指將具有一致的數據結構(屬性)和行為(操作)的對象抽象成類。一個類就是這樣一種抽象,它反映了與應用有關的重要性質,而忽略其他一些無關內容。任何類的劃分都是主觀的,但必須與具體的應用有關。
(3)繼承性
繼承性是子類自動共享父類數據結構和方法的機制,這是類之間的一種關系。在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並加入若干新的內容。
繼承性是面向對象程序設計語言不同於其它語言的最重要的特點,是其他語言所沒有的。
在類層次中,子類只繼承一個父類的數據結構和方法,則稱為單重繼承。
在類層次中,子類繼承了多個父類的數據結構和方法,則稱為多重繼承。
在軟體開發中,類的繼承性使所建立的軟體具有開放性、可擴充性,這是信息組織與分類的行之有效的方法,它簡化了對象、類的創建工作量,增加了代碼的可重性。
採用繼承性,提供了類的規范的等級結構。通過類的繼承關系,使公共的特性能夠共享,提高了軟體的重用性。
(4)多態性(多形性)
多態性使指相同的操作或函數、過程可作用於多種類型的對象上並獲得不同的結果。不同的對象,收到同一消息可以產生不同的結果,這種現象稱為多態性。
多態性允許每個對象以適合自身的方式去響應共同的消息。
多態性增強了軟體的靈活性和重用性。

『捌』 數據結構包括哪幾種基本結構,各有什麼特點

三種:

集合結構。特點:
集合中任何兩個數據元素之間都沒有邏輯關系,組織形式鬆散.

樹形結構。特點:樹形結構具有分支、層次特性,其形態有點象自然界中的樹.
③圖狀結構。特點:圖狀結構中的結點按邏輯關系互相纏繞,任何兩個結點都可以鄰接。
非線性結構
傳統文本(例如書籍中的文章和計算機的文本文件)都是線性結構,閱讀是需要注意順序閱讀,而超文本則是一個非線性結構。在製作文本時,可將寫作素材按內部聯系劃分成不同關系的單元,然後用製作工具將其組成一個網型結構。閱讀時,不必按線性方式順序往下讀,而是有選擇的閱讀自己感興趣的部分。

『玖』 什麼是抽象數據類型

問題一:數據結構 抽象數據類型是什麼? 這兩個概念,尤其是第一個都是特別抽象的概念,沒什麼具體可對應的實體可以給你舉例,我就粘貼復制了,說說我的理解吧。
數據埂構呢,我們總是為了完成一個功能或者目的寫程序,但不管什麼程序、代碼實際上都是一些指令的 *** ,說白了就是在描述「怎麼做」,而光知道怎麼做還只是問題的一半,還要知道「做什麼」,也就是剛才那些指令的對象是誰,自然肯定是相關的數據,比如說學生信息管理中,指令是增加學生,那他的對象就是學生信息這種數據,指令是成績統計,那對象就是學生的成績數據,而在我們的程序中,數據也必須要有一種很明確的組織表示方式,只要這樣我們才能在這種具體明確的實體上編寫指令,比如說學生數據可以定義為一個多維的數組,只有這樣我們再寫增加學生時,才能知道具體增加就是增加一個數組元素並未其賦值。所以數據結構就是相互之間有聯系的具有某種組織方式的數據 *** 。
抽象數據類型相比較數據結構要具體一些,我們光有了數據結構還不夠,因為數據是各種各樣的,對於不同數據,我們能採取的方法也不一樣,比如說學生數據可以增減,成績數據可以進行算數運算,但是為什麼說抽象呢,也就說他並不是具體整型還是字元型這種基本類型,而是我們根據我們要解決的實際問題,對應現實世界所描述的一種和現實世界中的實體對應的數據類型,而且這種抽象的數據類型還包括能夠對於他實行的操作,比如說我們定義一種數據類型叫「學生」,具體的數據我可以定義一中類似表的結構存儲,而且還要定義一些操作,比如說添加學生,刪除學生,這兩部分就共同組成了「學生」這個抽象的數據類型。
不知你明白沒?

問題二:我去!到底什麼是抽象數據類型,幹啥用的? 抽象數據類型是基於一類邏輯關系的數據類型以及定義在這個類型之上的一組操作。通俗點說就是某個數據結構的定義和對個數據結構的所有操都放在一起,這樣看著比較整潔。比如線性表抽象數據類型就是線性表的數學定義,和對線性表的求長度,判斷是否為空,插入刪除元素,等一系列函數放在一起的一大塊東西。你大概理解就行,主要是要把裡面每個函數的實現過程搞清楚。

問題三:抽象數據類型有什麼用?怎麼用? 首相數據類型,泛指除基本數據類型以外的數據類型。什麼叫類型?就是一類數據。基本數據類型被人做是最基本地,不可再劃分的數據,一般就是整形、浮點型、以及字元型。抽象數據類型是由若干基本數據類型歸並之後形成的一種新的數據類型,這種類型由用戶定義,功能操作比基本數據類型更多,一般包括結構體和類。其實說白了,抽象數據類型就是把一些有一定關聯的基本數據類型打包,然後當做新的數據類型使用。
至於有伐么用,這個用處可大了。比如你要實現對一個人地信息管理,如果你只用基本數據類型那麼你需要定義很多數據類型的變數比如名字、性別、出生地、生日之類的,並且操作起來不方便。如果用抽象數據來實現就簡單了,直接把這些信息放包裝在一個新的數據類型中,然後就可以直接定義這樣的一個變數就可以了。
C++中的類更好的實現了封裝功能,這就是類。類使得抽象數據類型的可操作性更強了,真正實現了面向對象。至於用法,只要學過C++肯定知道類地用法吧?那就是如何用。也許你現在覺得這樣的操作更麻煩了,還不如C語言簡潔的好。但是當你有一天真正的進入了公司,你才發現面向對象編程是多麼棒的一種編程方式,他可以讓你更高效的去開發。
同時告訴你,你對負責操作不是很了解只能證明你的編程數量不夠,在編程領域中永遠要記住一句話:鋼是打出來的。編程僅僅靠看書或是聽老師講解是行不通的,必須親自躬行才能真正掌握它

問題四:數據結構里抽象數據類型定義有什麼用? 編寫一個數據類型作為基礎類型,這些抽象操作就轉換為該類型的成員函數,如果對外的介面就在公有域中,其他在保護或者私有按具體情況
編寫該基礎類型後,再聲明對象,通供對象使用這些操作了

問題五:在數據結構里,什麼是抽象數據類型 1、象數據類型(Abstract Data Type 簡稱ADT)是指一個數學模型以及定義在此數學模型上的一組操作。
2、抽象數據類型需要通過固有數據類型(高級編程語言中已實現的數據類型)來實現。
3、抽象數據類型是與表示無關的數據類型,是一個數據模型及定義在該模型上的一組運算。
4、對一個抽象數據類型進行定義時,必須給出它的名字及各運算的運算符名,即函數名,並且規定這些函數的參數性質。一旦定義了一個抽象數據類型及具體實現,程序設計中就可以像使用基本數據類型那樣,十分方便地使用抽象數據類型。

問題六:抽象數據類型與數據結構有什麼具體的區別和聯系 5分 數據結構、數據類型和抽象數據類型,這三個術語在字面上既不同又相近,反映出它們在含義上既有區別又有聯系。
數據結構是在整個計算機科學與技術領域上廣泛被使用的術語。它用來反映一個數據的內部構成,即一個數據由哪些成分數據構成,以什麼方式構成,呈什麼結構。數據結構有邏輯上的數據結構和物理上的數據結構之分。邏輯上的數據結構反映成分數據之間的邏輯關系,物理上的數據結構反映成分數據在計算機內的存儲安排。數據結構是數據存在的形式。
v數據是按照數據結構分類的,具有相同數據結構的數據屬同一類。同一類數據的全體稱為一個數據類型。在程序設計高級語言中,數據類型用來說明一個數據在數據分類中的歸屬。它是數據的一種屬性。這個屬性限定了該數據的變化范圍。為了解題的需要,根據數據結構的種類,高級語言定義了一系列的數據類型。不同的高級語言所定義的數據類型不盡相同。Pascal語言所定義的數據類型的種類如圖1-8所示。
其中,簡單數據類型對應於簡單的數據結構;構造數據類型對應於復雜的數據結構;在復雜的數據結構里,允許成分數據本身具有復雜的數據結構,因而,構造數據類型允許復合嵌套;指針類型對應於數據結構中成分數據之間的關系,表面上屬簡單數據類型,實際上都指向復雜的成分數據即構造數據類型中的數據,因此這里沒有把它劃入簡單數據類型,也沒有劃入構造數據類型,而單獨劃出一類。
數據結構反映數據內部的構成方式,它常常用一個結構圖來描述:數據中的每一項成分數據被看作一個結點,並用方框或圓圈表示,成分數據之間的關系用相應的結點之間帶箭號的連線表示。如果成分數據本身又有它自身的結構,則結構出現嵌套。這里嵌套還允許是遞歸的嵌套。
由於指針數據的引入,使構造各種復雜的數據結構成為可能。按數據結構中的成分數據之間的關系,數據結構有線性與非線性之分。在非線性數據結構中又有層次與網狀之分。 由於數據類型是按照數據結構劃分的,因此,一類數據結構對應著一種數據類型。數據類型按照該類型中的數據所呈現的結構也有線性與非線性之分,層次與網狀之分。一個數據變數,在高級語言中的類型說明必須是讀變數所具有的數據結構所對應的數據類型。
最常用的數據結構是數組結構和記錄結構。數組結構的特點是:
成分數據的個數固定,它們之間的邏輯關系由成分數據的序號(或叫數組的下標)來體現。這些成分數據按照序號的先後順序一個挨一個地排列起來。
每一個成分數據具有相同的結構(可以是簡單結構,也可以是復雜結構),因而屬於同一個數據類型(相應地是簡單數據類型或構造數據類型)。這種同一的數據類型稱為基類型。
所有的成分數據被依序安排在一片連續的存儲單元中。
概括起來,數組結構是一個線性的、均勻的、其成分數據可隨機訪問的結構。由於這種結構有這些良好的特性,所以最常被人們所採用。在高級語言中,與數組結構相對應的數據類型是數組類型,即數組結構的數據變數必須說明為array [i] of T0 ,其中i是數組結構的下標類型,而T0是數組結構的基類型。
記錄結構是另一種常用的數據結構。它的特點是:
與數組結構一樣,成分數據的個數固定。但成分數據之間沒有自然序,它們處於平等地位。每一個成分數據被稱為一個域並賦予域名。不同的域有不同的域名。
不同的域允許有不同的結構,因而允許屬於不同的數據類型。
與數組結構一樣,它們可以隨機訪問,但訪問的途徑靠的是域名。
在高級語言中記錄結構對應的數據類型是記錄類型。記錄結構的數據的變數必須說......>>

問題七:抽象數據類型 類的基礎:抽象數據類型抽象數據類型(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就修改字體大小而言,這些做法都存在一個限制,即要求調用方代碼直接控制數據成員,這無疑......>>

問題八:抽象數據類型的簡介 抽象數據類型的描述包括給出抽象數據類型的名稱、數據的 *** 、數據之間的關系和操作的 *** 等方面的描述。抽象數據類型的設計者根據這些描述給出操作的具體實現,抽象數據類型的使用者依據這些描述使用抽象數據類型。

問題九:抽象數據類型定義有哪些內容 內容定義闡發已
存儲結構計算機內才意義邏輯結構映射已所存儲結構算重復沒意義
邏輯結構包含數據象數據關系
數據運算包含數據象數據關系基本操作集
三元素復合已
比產力構要素勞者勞工具勞象勞工具勞象歸勞資料

問題十:c/c++中類和抽象數據類型的區別 抽象數據類型
abstract data type
其實更多的是一種數據結構上的概念
類的話你因該比較熟悉,
比如我們要做一個鏈表
我們這次對class A;寫一個鏈表,
但是可能換了class V又要寫一個新的鏈表
為了避免這種重復性勞動
我們可以創造一個模板,提供一些基本操作
如插入,刪除,排序等等
然後以後所有類型都可以使用
最著名的就是STL庫了
實現了list,vector.stack,queue
等等
使用么
vector a;
class A{};
stack b;
可以看一下STL的使用

『拾』 數據結構

何謂數據結構
?
數據結構是在整個計算機科學與技術領域上廣泛被使用的術語。它用來反映一個數據的內部構成,即一個數據由那些成分數據構成,以什麼方式構成,呈什麼結構。數據結構有邏輯上的數據結構和物理上的數據結構之分。邏輯上的數據結構反映成分數據之間的邏輯關系,而物理上的數據結構反映成分數據在計算機內部的存儲安排。數據結構是數據存在的形式。 數據結構是信息的一種組織方式,其目的是為了提高演算法的效率,它通常與一組演算法的集合相對應,通過這組演算法集合可以對數據結構中的數據進行某種操作。
?
數據結構主要研究什麼?
?
數據結構作為一門學科主要研究數據的各種邏輯結構和存儲結構,以及對數據的各種操作。因此,主要有三個方面的內容:數據的邏輯結構;數據的物理存儲結構;對數據的操作(或演算法)。通常,演算法的
?
設計取決於數據的邏輯結構,演算法的實現取決於數據的物理存儲結構。
?
什麼是數據結構?什麼是邏輯結構和物理結構?
?
數據是指由有限的符號(比如,"0"和"1",具有其自己的結構、操作、和相應的語義)組成的元素的集合。結構是元素之間的關系的集合。通常來說,一個數據結構DS 可以表示為一個二元組:
?
DS=(D,S), //i.e., data-structure=(data-part,logic-structure-part) 這里D是數據元素的集合(或者是「結點」,可能還含有「數據項」或「數據域」),S是定義在D(或其他集合)上的關系的集合,S = { R | R : D×D×...},稱之為元素的邏輯結構。 邏輯結構有四種基本類型:集合結構、線性結構、樹狀結構和網路結構。表和樹是最常用的兩種高效數據結構,許多高效的演算法可以用這兩種數據結構來設計實現。表是線性結構的(全序關系),樹(偏序或層次關系)和圖(局部有序(weak/local orders))是非線性結構。
?
數據結構的物理結構是指邏輯結構的存儲鏡像(image)。數據結構 DS 的物理結構 P對應於從 DS 的數據元素到存儲區M(維護著邏輯結構S)的一個映射:
?
(PD,S) -- > M 存儲器模型:一個存儲器 M 是一系列固定大小的存儲單元,每個單元 U 有一個唯一的地址 A(U),該地址被連續地編碼。每個單元 U 有一個唯一的後繼單元 U'=succ(U)。 P 的四種基本映射模型:順序(sequential)、鏈接(linked)、索引(indexed)和散列(hashing)映射。
?
因此,我們至少可以得到4×4種可能的物理數據結構:
?
sequential (sets)
linked lists
indexed trees
hash graphs
?
(並不是所有的可能組合都合理)
?
??? 數據結構DS上的操作:所有的定義在DS上的操作在改變數據元素(節點)或節點的域時必須保持DS的邏輯和物理結構。
?
DS上的基本操作:任何其他對DS的高級操作都可以用這些基本操作來實現。最好將DS和他的所有基本操作看作一個整體——稱之為模塊。我們可以進一步將該模塊抽象為數據類型(其中DS的存儲結構被表示為私有成員,基本操作被表示為公共方法),稱之為ADT。作為ADT,堆棧和隊列都是一種特殊的表,他們擁有表的操作的子集。 對於DATs的高級操作可以被設計為(不封裝的)演算法,利用基本操作對DS進行處理。
?
好的和壞的DS:如果一個DS可以通過某種「線性規則」被轉化為線性的DS(例如線性表),則稱它為好的DS。好的DS通常對應於好的(高效的)演算法。這是由計算機的計算能力決定的,因為計算機本質上只能存取邏輯連續的內存單元,因此如何沒有線性化的結構邏輯上是不可計算的。比如對一個圖進行操作,要訪問圖的所有結點,則必須按照某種順序來依次訪問所有節點(要形成一個偏序),必須通過某種方式將圖固有的非線性結構轉化為線性結構才能對圖進行操作。
?
樹是好的DS——它有非常簡單而高效的線性化規則,因此可以利用樹設計出許多非常高效的演算法。樹的實現和使用都很簡單,但可以解決大量特殊的復雜問題,因此樹是實際編程中最重要和最有用的一種數據結構。樹的結構本質上有遞歸的性質——每一個葉節點可以被一棵子樹所替代,反之亦然。實際上,每一種遞歸的結構都可以被轉化為(或等價於)樹形結構。
?

從機器語言到高級語言的抽象
?
我們知道,演算法被定義為一個運算序列。這個運算序列中的所有運算定義在一類特定的數據模型上,並以解決一類特定問題為目標。這個運算序列應該具備下列四個特徵。 有限性,即序列的項數有限,且每一運算項都可在有限的時間內完成;確定性,即序列的每一項運算都有明確的定義,無二義性;可以沒有輸入運算項,但一定要有輸出運算項;可行性,即對於任意給定的合法的輸入都能得到相應的正確的輸出。這些特徵可以用來判別一個確定的運算序列是否稱得上是一個演算法。 但是,我們現在的問題不是要判別一個確定的運算序列是否稱得上是一個演算法,而是要對一個己經稱得上是演算法的運算序列,回顧我們曾經如何用程序設計語言去表達它。
?
演算法的程序表達,歸根到底是演算法要素的程序表達,因為一旦演算法的每一項要素都用程序清楚地表達,整個演算法的程序表達也就不成問題。
?
作為運算序列的演算法,有三個要素。 作為運算序列中各種運算的運算對象和運算結果的數據;運算序列中的各種運算;運算序列中的控制轉移。這三種要素依序分別簡稱為數據、運算和控制。 由於演算法層出不窮,變化萬千,其中的運算所作用的對象數據和所得到的結果數據名目繁多,不勝枚舉。最簡單最基本的有布爾值數據、字元數據、整數和實數數據等;稍復雜的有向量、矩陣、記錄等數據;更復雜的有集合、樹和圖,還有聲音、圖形、圖像等數據。 同樣由於演算法層出不窮,變化萬千,其中運算的種類五花八門、多姿多彩。最基本最初等的有賦值運算、算術運算、邏輯運算和關系運算等;稍復雜的有算術表達式和邏輯表達式等;更復雜的有函數值計算、向量運算、矩陣運算、集合運算,以及表、棧、隊列、樹和圖上的運算等:此外,還可能有以上列舉的運算的復合和嵌套。 關於控制轉移,相對單純。在串列計算中,它只有順序、分支、循環、遞歸和無條件轉移等幾種。
?
我們來回顧一下,自從計算機問世以來,演算法的上述三要素的程序表達,經歷過一個怎樣的過程。
?
最早的程序設計語言是機器語言,即具體的計算機上的一個指令集。當時,要在計算機上運行的所有演算法都必須直接用機器語言來表達,計算機才能接受。演算法的運算序列包括運算對象和運算結果都必須轉換為指令序列。其中的每一條指令都以編碼(指令碼和地址碼)的形式出現。與演算法語言表達的演算法,相差十萬八千里。對於沒受過程序設計專門訓練的人來說,一份程序恰似一份"天書",讓人看了不知所雲,可讀性
?
極差。
?
用機器語言表達演算法的運算、數據和控制十分繁雜瑣碎,因為機器語言所提供的指令太初等、原始。機器語言只接受算術運算、按位邏輯運算和數的大小比較運算等。對於稍復雜的運算,都必須一一分解,直到到達最初等的運算才能用相應的指令替代之。機器語言能直接表達的數據只有最原始的位、位元組、和字三種。演算法中即使是最簡單的數據如布爾值、字元、整數、和實數,也必須一一地映射到位、位元組和字
中,還得一一分配它們的存儲單元。對於演算法中有結構的數據的表達則要麻煩得多。機器語言所提供的控制轉移指令也只有無條件轉移、條件轉移、進入子程序和從子程序返回等最基本的幾種。用它們來構造循環、形成分支、調用函數和過程得事先做許多的准備,還得靠許多的技巧。 直接用機器語言表達演算法有許多缺點。
?

大量繁雜瑣碎的細節牽制著程序員,使他們不可能有更多的時間和精力去從事創造性的勞動,執行對他們來說更為重要的任務。如確保程序的正確性、高效性。程序員既要駕馭程序設計的全局又要深入每一個局部直到實現的細節,即使智力超群的程序員也常常會顧此失彼,屢出差錯,因而所編出的程序可靠性差,且開發周期長。 由於用機器語言進行程序設計的思維和表達方式與人們的習慣大相徑庭,只有經過
較長時間職業訓練的程序員才能勝任,使得程序設計曲高和寡。因為它的書面形式全是"密"碼,所以可讀性差,不便於交流與合作。因為它嚴重地依賴於具體的計算機,所以可移植性差,重用性差。這些弊端造成當時的計算機應用未能迅速得到推廣。
?
克服上述缺點的出路在於程序設計語言的抽象,讓它盡可能地接近於演算法語言。 為此,人們首先注意到的是可讀性和可移植性,因為它們相對地容易通過抽象而得到改善。於是,很快就出現匯編語言。這種語言對機器語言的抽象,首先表現在將機器語言的每一條指令符號化:指令碼代之以記憶符號,地址碼代之以符號地址,使得其含義顯現在符號上而不再隱藏在編碼中,可讓人望"文"生義。其次表現在這種語言擺脫了具體計算機的限制,可在不同指令集的計算機上運行,只要該計算機配上匯編語言的一個匯編程序。這無疑是機器語言朝演算法語言靠攏邁出的一步。但是,它離演算法語言還太遠,以致程序員還不能從分解演算法的數據、運算和控制到匯編才能直接表達的指令等繁雜瑣碎的事務中解脫出來。 到了50年代中期,出現程序設計的高級語言如Fortran,Algol60,以及後來的PL/l, Pascal等,演算法的程序表達才產生一次大的飛躍。
?
誠然,演算法最終要表達為具體計算機上的機器語言才能在該計算機上運行,得到所需要的結果。但匯編語言的實踐啟發人們,表達成機器語言不必一步到位,可以分兩步走或者可以築橋過河。即先表達成一種中介語言,然後轉成機器語言。匯編語言作為一種中介語言,並沒有獲得很大成功,原因是它離演算法語
?
言還太遠。這便指引人們去設計一種盡量接近演算法語言的規范語言,即所謂的高級語言,讓程序員可以用它方便地表達演算法,然後藉助於規范的高級語言到規范的機器語言的"翻譯",最終將演算法表達為機器語言。而且,由於高級語言和機器語言都具有規范性,這里的"翻譯"完全可以機械化地由計算機來完成,就像匯編語言被翻譯成機器語言一樣,只要計算機配上一個編譯程序。 上述兩步,前一步由程序員去完成,後一步可以由編譯程序去完成。在規定清楚它們各自該做什麼之後,這兩步是完全獨立的。它們各自該如何做互不相干。前一步要做的只是用高級語言正確地表達給定的演算法,產生一個高級語言程序;後一步要做的只是將第一步得到的高級語言程序翻譯成機器語言程序。至於程序員如何用高級語言表達演算法和編譯程序如何將高級語言表達的演算法翻譯成機器語言表達的演算法,顯然毫不相干。
?
處理從演算法語言最終表達成機器語言這一復雜過程的上述思想方法就是一種抽象。匯編語言和高級語言的出現都是這種抽象的範例。 與匯編語言相比,高級語言的巨大成功在於它在數據、運算和控制三方
?
面的表達中引入許多接近演算法語言的概念和工具,大大地提高抽象地表達演算法的能力。 在運算方面,高級語言如Pascal,除允許原封不動地運用演算法語言的四則運算、邏輯運算、關系運算、算術表達式、邏輯表達式外,還引入強有力的函數與過程的工具,並讓用戶自定義。這一工具的重要性不僅在於它精簡了重復的程序文本段,而且在於它反映出程序的兩級抽象。
?
在函數與過程調用級,人們只關心它能做什麼,不必關心它如何做。只是到函數與過程的定義時,人們才給出如何做的細節。用過高級語言的讀者都知道,一旦函數與過程的名稱、參數和功能被規定清楚,那麼,在程序中調用它們便與在程序的頭部說明它們完全分開。你可以修改甚至更換函數體與過程體,而不影響它們的被調用。如果把函數與過程名看成是運算名,把參數看成是運算的對象或運算的結果,那麼
?
,函數與過程的調用和初等運算的引用沒有兩樣。利用函數和過程以及它們的復合或嵌套可以很自然地表達演算法語言中任何復雜的運算。
?
在數據方面,高級語言如Pascal引人了數據類型的概念,即把所有的數據加以分類。每一個數據(包括表達式)或每一個數據變數都屬於其中確定的一類。稱這一類數據為一個數據類型。 因此,數據類型是數據或數據變數類屬的說明,它指示該數據或數據變數可能取的值的全體。對於無結構的數據,高級語言如Pascal,除提供標準的基本數據類型--布爾型、字元型、整型和實型外,還提供用戶可自定義的枚舉類、子界類型和指針類型。這些類型(除指針外),其使用方式都順應人們在演算法語言中使用的習慣。對於有結構的數據,高級語言如Pascal,提供了數組、記錄、有限制的集合和文件等四種標準的結構數據類型。其中,數組是科學計算中的向量、矩陣的抽象;記錄是商業和管理中的記錄的抽象;有限制的集合是數學中足夠小的集合的勢集的抽象;文件是諸如磁碟等外存儲數據的抽象。
?
人們可以利用所提供的基本數據類型(包括標準的和自定義的),按數組、記錄、有限制的集合和文件的構造規則構造有結構的數據。 此外,還允許用戶利用標準的結構數據類型,通過復合或嵌套構造更復雜更高層的結構數據。這使得高級語言中的數據類型呈明顯的分層。 高級語言中數據類型的分層是沒有窮盡的,因而用它們可以表達演算法語言中任何復雜層次的數據。 在控制方面,高級語言如Pascal,提供了表達演算法控制轉移的六種方式。
?
(1)預設的順序控制";"。
?
(2)條件(分支)控制:"if表達式(為真)then S1 else S2;" 。
?
(3)選擇(情況)控制:
?
"Case 表達式 of
?
值1: S1
值2: S2
...
值n: Sn
end"
?
(4)循環控制:
?
"while 表達式(為真) do S;" 或
"repeat S until 表達式(為真);" 或
"for變數名:=初值 to/downto 終值do S;"
?
(5)函數和過程的調用,包括遞歸函數和遞歸過程的調用。
?
(6)無條件轉移goto。

這六種表達方式不僅覆蓋了演算法語言中所有控製表達的要求,而且不再像機器語言或匯編語言那樣原始、那樣繁瑣、那樣隱晦,而是如上面所看到的,與自然語言的表達相差無幾。 程序設計語言從機器語言到高級語言的抽象,帶來的主要好處是: 高級語言接近演算法語言,易學、易掌握,一般工程技術人員只要幾周時間的培訓就可以勝任程序員的工作;高級語言為程序員提供了結構化程序設計的環境和工具,使得設計出來的程序可讀性好,可維護性強,可靠性高;高級語言遠離機器語言,與具體的計算機硬體關系不大,因而所寫出來的程序可移植性好,重用率高; 由於把繁雜瑣碎的事務交給了編譯程序去做,所以自動化程度高,開發周期短,且程、序員得到解脫,可以集中時間和精力去從事對於他們來說更為重要的創造性勞動,以提高、程序的質量。
?
數據結構、數據類型和抽象數據類型
?
數據結構、數據類型和抽象數據類型,這三個術語在字面上既不同又相近,反映出它們在含義上既有區別又有聯系。
?
數據結構是在整個計算機科學與技術領域上廣泛被使用的術語。它用來反映一個數據的內部構成,即一個數據由哪些成分數據構成,以什麼方式構成,呈什麼結構。數據結構有邏輯上的數據結構和物理上的數據結構之分。邏輯上的數據結構反映成分數據之間的邏輯關系,物理上的數據結構反映成分數據在計算機內的存儲安排。數據結構是數據存在的形式。
?
數據是按照數據結構分類的,具有相同數據結構的數據屬同一類。同一類數據的全體稱為一個數據類型。在程序設計高級語言中,數據類型用來說明一個數據在數據分類中的歸屬。它是數據的一種屬性。這個屬性限定了該數據的變化范圍。為了解題的需要,根據數據結構的種類,高級語言定義了一系列的數據類型。不同的高級語言所定義的數據類型不盡相同。Pascal語言所定義的數據類型的種類。
?
其中,簡單數據類型對應於簡單的數據結構;構造數據類型對應於復雜的數據結構;在復雜的數據結構里,允許成分數據本身具有復雜的數據結構,因而,構造數據類型允許復合嵌套;指針類型對應於數據結構中成分數據之間的關系,表面上屬簡單數據類型,實際上都指向復雜的成分數據即構造數據類型中的數據,因此這里沒有把它劃入簡單數據類型,也沒有劃入構造數據類型,而單獨劃出一類。
?
數據結構反映數據內部的構成方式,它常常用一個結構圖來描述:數據中的每一項成分數據被看作一個結點,並用方框或圓圈表示,成分數據之間的關系用相應的結點之間帶箭號的連線表示。如果成分數據本身又有它自身的結構,則結構出現嵌套。這里嵌套還允許是遞歸的嵌套。
?
由於指針數據的引入,使構造各種復雜的數據結構成為可能。按數據結構中的成分數據之間的關系,數據結構有線性與非線性之分。在非線性數據結構中又有層次與網狀之分。 由於數據類型是按照數據結構劃分的,因此,一類數據結構對應著一種數據類型。數據類型按照該類型中的數據所呈現的結構也有線性與非線性之分,層次與網狀之分。一個數據變數,在高級語言中的類型說明必須是讀變數所具有的數據結構所對應的數據類型。最常用的數據結構是數組結構和記錄結構。數組結構的特點是:
?
成分數據的個數固定,它們之間的邏輯關系由成分數據的序號(或叫數組的下標)來體現。這些成分數據按照序號的先後順序一個挨一個地排列起來。每一個成分數據具有相同的結構(可以是簡單結構,也可以是復雜結構),因而屬於同一個數據類型(相應地是簡單數據類型或構造數據類型)。這種同一的數據類型稱為基類型。所有的成分數據被依序安排在一片連續的存儲單元中。 概括起來,數組結構是一個線性的、均勻的、其成分數據可隨機訪問的結構。
?
由於這、種結構有這些良好的特性,所以最常被人們所採用。在高級語言中,與數組結構相對應的、數據類型是數組類型,即數組結構的數據變數必須說明為array [i] of T0 ,其中i是數組、結構的下標類型,而T0是數組結構的基類型。 記錄結構是另一種常用的數據結構。它的特點是:與數組結構一樣,成分數據的個數固定。但成分數據之間沒有自然序,它們處於平等地位。每一個成分數據被稱為一個域並賦予域名。不同的域有不同的域名。不同的域允許有不同的結構,因而允許屬於不同的數據類型。與數組結構一樣,它們可以隨機訪問,但訪問的途徑靠的是域名。在高級語言中記錄結構對應的數據類型是記錄類型。記錄結構的數據的變數必須說明為記錄類型。
?
抽象數據類型的含義在上一段已作了專門敘述。它可理解為數據類型的進一步抽象。即把數據類型和數據類型上的運算捆在一起,進行封裝。引入抽象數據類型的目的是把數據類型的表示和數據類型上運算的實現與這些數據類型和運算在程序中的引用隔開,使它們相互獨立。對於抽象數據類型的描述,除了必須描述它的數據結構外,還必須描述定義在它上面的運算(過程或函數)。抽象數據類型上定義的過程和函
數以該抽象數據類型的數據所應具有的數據結構為基礎。
?
泛型設計和數據結構與演算法
?
下面我想再說說關於泛型程序設計模型對於數據結構和演算法方面的最新推動,泛型思想已經把數據結
?
構和演算法方面的基本思想抽象到了一個前所未有的高度,現在有多種程序設計語言支持泛型設計,比如
ADA,C++,而且據說在JAVA的下一版本和C#中也將對泛型設計進行全面的支持。
?
先說說泛型設計的基本思想:泛型編程(generic programming,以下直接以GP稱呼)是一種全新的程序設計思想,和OO,OB,PO這些為人所熟知的程序設計想法不同的是GP抽象度更高,基於GP設計的組件之間偶合度底,沒有繼承關系,所以其組件間的互交性和擴展性都非常高。我們都知道,任何演算法都是作用在一種特定的數據結構上的,最簡單的例子就是快速排序演算法最根本的實現條件就是所排序的對象是存
貯在數組裡面,因為快速排序就是因為要用到數組的隨機存儲特性,即可以在單位時間內交換遠距離的對象,而不只是相臨的兩個對象,而如果用聯表去存儲對象,由於在聯表中取得對象的時間是線性的既O[n],這樣將使快速排序失去其快速的特點。也就是說,我們在設計一種演算法的時候,我們總是先要考慮其應用的數據結構,比如數組查找,聯表查找,樹查找,圖查找其核心都是查找,但因為作用的數據結構不同
?
將有多種不同的表現形式。數據結構和演算法之間這樣密切的關系一直是我們以前的認識。泛型設計的根本思想就是想把演算法和其作用的數據結構分離,也就是說,我們設計演算法的時候並不去考慮我們設計的演算法將作用於何種數據結構之上。泛型設計的理想狀態是一個查找演算法將可以作用於數組,聯表,樹,圖等各種數據結構之上,變成一個通用的,泛型的演算法。這樣的理想是不是很誘惑人?
?
泛型編程帶來的是前所未有的彈性以及不會損失效率的抽象性,GP和OO不同,它不要求你通過額外的間接層來調用函數:它讓你撰寫完全一般化並可重復使用的演算法,其效率與針對特定數據結構而設計的演算法旗鼓相當。我們大家都知道數據結構在C++中可以用用戶定義類型來表示,而C++中的模板技術就是以類型作為參數,那麼我可以想像利用模板技術可以實現我們開始的GP思想,即一個模板函數可以對於各種傳遞進來的類型起作用,而這些類型就可以是我們定義的各種數據結構。
?
泛型演算法抽離於特定類型和特定數據結構之外,使得其適應與盡可能的一般化類型,演算法本身只是為了實現演算法其需要表達的邏輯本質而不去被為各種數據結構的實現細節所干擾。這意味著一個泛型演算法實際具有兩部分。1,用來描敘演算法本質邏輯的實際指令;2,正確指定其參數類型必須滿足的性質的一組需求條件。到此,相信有不少人已經開始糊塗了,呵呵,不要緊。畢竟GP是一種抽象度非常高的程序設計思想,裡面的核心就是抽象條件成為成為程序設計過程中的核心,從而取代了類型這在OO裡面的核心地位,正是因為類型不在是我們考慮的重點,類型成為了抽象條件的外衣,所以我們稱這樣的程序思想為泛型思想------把類型泛化。
這樣可以么?

閱讀全文

與數組這種數據結構的特點有哪些相關的資料

熱點內容
花唄如何支付交易費用 瀏覽:478
安幕茵代理公司怎麼樣 瀏覽:414
銀行系統交易碼四位數是什麼意思 瀏覽:712
什麼技術能帶回家 瀏覽:520
專利中多個技術點什麼意思 瀏覽:314
寬頻數據掉了怎麼修 瀏覽:620
貴港水果批發市場在哪裡 瀏覽:614
氣溫高溫差大是可以養什麼水產品 瀏覽:802
正大飼料黑河代理是哪裡 瀏覽:642
excel如何輸入規律數據 瀏覽:961
如何落實產品一致性檢查 瀏覽:987
民房交易在什麼地方辦理 瀏覽:368
程序後面加點什麼意思 瀏覽:346
小程序每日交作業怎麼批改 瀏覽:99
交易成功結束是什麼意思 瀏覽:652
poss機的代理怎麼做 瀏覽:139
如何看懂交易所的k線圖 瀏覽:320
朋友送的減肥產品怎麼樣 瀏覽:986
微信查社保的小程序是什麼 瀏覽:810
政府名下房產交易有哪些規定 瀏覽:742