數據結構(程序設計=數據結構+算法)
數據結構就是關係,沒錯,就是數據元素相互之間存在的一種或多種特定關係的集合。算法
傳統上,咱們把數據結構分爲邏輯結構和物理結構。編程
邏輯結構:是指數據對象中數據元素之間的相互關係,也是咱們從此最須要關注和討論的問題。數組
物理結構:是指數據的邏輯結構在計算機中的存儲形式。markdown
經常使用的數據結構有:數據結構
數組,隊列(queue),堆(heap),棧(stack),鏈表(linked list ),樹(tree),圖(graph)和散列表(hash)
棧(stack):運算只在表的一端進行;隊列(Queue):運算只在表的兩端進行。編程語言
隊列(queue)是隻容許在一端進行插入操做,而在另外一端進行刪除操做的線性表。ui
與棧相反,隊列是一種先進先出(First In First Out, FIFO)的線性表。spa
與棧相同的是,隊列也是一種重要的線性結構,實現一個隊列一樣須要順序表或鏈表做爲基礎。設計
集合結構
code
線性結構
樹形結構
圖形結構
數據元素的存儲結構形式有兩種:順序存儲和鏈式存儲。
例如咱們編程語言的數組結構就是這樣滴。
鏈式存儲結構:是把數據元素存放在任意的存儲單元裏,這組存儲單元能夠是連續的,也能夠是不連續的。
鏈式存儲結構
線性表:就好像是排隊同樣,具備線同樣性質的結構,它是由零個或多個數據元素組成的有限序列。
若元素存在多個,則第一個元素無前驅,而最後一個元素無後繼,其餘元素都有且只有一個前驅和後繼。
若將線性表記爲(a1,…,ai-1,ai,ai+1,…an),則表中ai-1領先於ai,ai領先於ai+1,稱ai-1是ai的直接前驅元素,ai+1是ai的直接後繼元素。
數據類型:是指一組性質相同的值的集合及定義在此集合上的一些操做的總稱。
例如不少編程語言的整型,浮點型,字符型這些指的就是數據類型。
在計算機中,內存不是無限大的,若是要計算或處理一些較大的數時,須要開闢較大的內存空間,因而就要對計算機進行數據類型分類,分出多種數據類型來適合各類不一樣的計算條件差別。
在C語言中,數據類型能夠分爲:
原子類型:不能夠再分解的基本類型,例如整型、浮點型、字符型等。
結構類型:由若干個類型組合而成,是能夠再分解的,例如整型數組是由若干整型數據組成的。
算法是解決特定問題求解步驟的描述,在計算機中表現爲指令的有限序列,而且每條指令表示一個或多個操做。
算法具備五個基本特徵:輸入、輸出、有窮性、肯定性和可行性。
輸出:算法至少有一個或多個輸出。
有窮性:指算法在執行有限的步驟以後,自動結束而不會出現無限循環,而且每個步驟在可接受的時間內完成。
肯定性:算法的每個步驟都具備肯定的含義,不會出現二義性。
可行性:算法的每一步都必須是可行的,也就是說,每一步都可以經過執行有限次數完成。
正確性:算法的正確性是指算法至少應該具備輸入、輸出和加工處理無歧義性、能正確反映問題的需求、可以獲得問題的正確答案。
高級語言編寫的程序在計算機上運行時所消耗的時間取決於下列因素:
1. 算法採用的策略,方案 2. 編譯產生的代碼質量 3. 問題的輸入規模 4. 機器執行指令的速度
咱們能夠想象,線性表有兩種物理存儲結構:順序存儲結構和鏈式存儲結構。
線性表的順序存儲結構,指的是用一段地址連續的存儲單元依次存儲線性表的數據元素。
線性表(a1,a2,…,an)的順序存儲以下:
#define MAXSIZE 20 typedef int ElemType; typedef struct { ElemType data[MAXSIZE]; int length; // 線性表當前長度 } SqList;
總結下,順序存儲結構封裝須要三個屬性:
存儲空間的起始位置,數組data,它的存儲位置就是線性表存儲空間的存儲位置。
線性表的最大存儲容量:數組的長度MaxSize。
線性表的當前長度:length。
若是插入位置不合理,拋出異常; 若是線性表長度大於等於數組長度,則拋出異常或動態增長數組容量; 從最後一個元素開始向前遍歷到第i個位置,分別將它們都向後移動一個位置; 將要插入元素填入位置i處; 線性表長+1。