學習的四大步驟:wwwa
1.什麼是a (what)
2.為什麼需要a (why)
3.怎麼用a (how)
4.需要注意的問題 (attention)
我們知道程式 = 資料結構 + 演算法,可見資料結構的重要性。在平時我們建立的乙個陣列以及對陣列的新增刪除操作都屬於資料結構的範疇。那麼,什麼是資料結構呢?
定義:我們如何把現實中大量而複雜的問題以特定的資料型別(個體)和特定的儲存結構(個體與個體之間的關係)儲存到主儲存器(記憶體)中,以及在此基礎上為實現某個功能而執行的相應操作,這個相應操作也叫演算法。其實,資料結構並沒有嚴格的定義,我們只需要了解到資料結構研究的是個體以及個體之間的關係
資料結構 = 個體 + 個體之間的關係衡量演算法的標準:演算法 = 對儲存資料的操作
1.時間複雜度:程式大概要執行的次數,而非執行的時間
2.空間複雜度:演算法執行過程中大概所占用的最大記憶體
3.難易程度:
4.健壯性:
5.正確性
邏輯結構
物理結構
資料的儲存結構分為:線性結構、非線性結構(樹、圖)
線性結構分為:連續儲存(陣列)、離散儲存(鍊錶)
線性結構的兩種常見應用:棧(先進後出)、佇列(先進先出)
記憶體中的堆和棧:是指記憶體的分配方式
鍊錶的定義:
鍊錶是乙個離散儲存的,每乙個結點只有乙個前驅結點和乙個後繼結點,且第乙個結點沒有前驅結點,最後乙個結點沒有後繼結點。
首結點、尾結點、頭結點、頭指標、尾指標:
首結點指的是第乙個有效結點;
尾結點指的是最後乙個有效結點;
頭結點指的是首結點前面的結點,頭結點並不存放有效資料,該結點的存在是為了對鍊錶更好的操作;
頭指標指的是指向頭結點的指標;
尾指標指的是指向尾結點的指標;
頭指標head必須存在頭結點不一定存在
a1是首結點確定乙個鍊錶只需要乙個引數:頭指標鍊錶的分類:單鏈表雙鏈表:每乙個結點有兩個指標域;
迴圈鍊錶:通過任何乙個結點可以找到其他所有的結點;
非迴圈鍊錶:
int i = 3;
int* p = (int *)malloc(sizeof(int) * 2);
p為指標變數,p儲存的是型別為int的位址,p儲存在棧區。p指向的內容儲存在堆區。
free( p):釋放的是p指標指向的記憶體空間,而不是p本身;
線性結構的兩種常用應用:棧和佇列。
棧:先進後出。類似於槍的彈夾
利用棧的儲存結構儲存資料的地方稱為棧區。棧是由系統自動管理的。
棧分為靜態棧和動態棧:
以陣列的形式用一塊連續的儲存空間進行資料儲存的棧稱為靜態棧;
以鍊錶的形式用不連續的儲存空間進行資料儲存的棧稱為動態棧;
佇列:先進先出。類似排隊。
佇列分為:靜態佇列和鏈式佇列
靜態佇列是以陣列的形式儲存的佇列。
靜態佇列必須是迴圈佇列。
迴圈佇列需了解的幾個問題:
靜態佇列為什麼必須是迴圈佇列
不管是對front指向的頭結點進行出隊刪除操作 ,還是對rear指向的尾結點的下乙個結點進行入隊新增操作,指標都是增加的,這樣勢必會造成記憶體浪費
迴圈佇列需要幾個引數能夠確定
乙個迴圈佇列的確定需要兩個引數:front和rear。
迴圈佇列各個引數的意義
front指向第乙個元素,rear指向最後乙個有效元素的下乙個元素。
或者
front指向第乙個有效元素的下乙個元素,rear指向最後乙個有效元素。
了解為什麼real需要指向最後乙個有效元素的下乙個元素。這是為了方便對佇列的操作,原因如下:
佇列的初始化操作:front和rear指向的都是空指標null
判斷乙個隊列為空:front=real
判斷乙個隊列為非空:front!=real
迴圈佇列的入隊偽演算法
1.將需要入隊的值付給rear指向的位置
2.rear = (rear + 1)%陣列的長度
迴圈佇列的出隊演算法
1.將front指向的值賦值給需要儲存的值
2.front = (front + 1)%陣列的長度
如何判斷乙個隊列為空
front = rear
如何判斷乙個佇列已滿
兩種方式:
第一種:在每個結點中新增乙個引數length,該引數記錄佇列長度,在front=rear時,判斷length的值,如果為0則隊列為空,如果為非0則為滿。
第二種:少用乙個元素,
front = (rear + 1)%陣列長度
堆區:是指的用堆排序的方法進行操作儲存的區域。
遞迴:乙個函式直接或間接呼叫自己,在滿足一定條件可以結束呼叫的函式
函式的呼叫的過程:
(一)當乙個函式呼叫另乙個函式時,在執行被呼叫函式之前,系統會做三件事:
將所有的實際引數,返回位址(呼叫函式的第乙個語句位址)等資訊傳遞給被呼叫函式儲存;
為被呼叫函式的區域性變數分配空間;
將控制轉移到被呼叫函式入口。
(二)從被呼叫函式返回到主呼叫函式之前,系統也要做三件事:
儲存被呼叫函式的返回值;
釋放被呼叫函式所佔的空間;(包括形參以及區域性引數)
依照被調函式儲存的返回位址資訊,將控制轉移到呼叫函式。
(三)函式互相呼叫,利用棧來完成
定義:有且只有乙個根結點;有若干個子樹,子樹也是樹
深度:從根節點到最底層節點的層數
葉子節點:沒有子節點的節點
度:子節點的個數
樹的度,按最大的度說
一般樹:任意乙個節點的子節點的個數都不受限制
二叉樹:任意乙個節點的子節點的個數最多兩個,且子節點的位置不可更改(有序的)
二叉樹的分類:
一般二叉樹:
滿二叉樹:全滿
完全二叉樹:如果只是刪除了滿二叉樹最底層右邊的連續若干個節點,這樣形成的二叉樹就是完全二叉樹
二叉樹的性質:
1)在二叉樹的第i層上,最多有2^(i-1)個結點
2)深度為k的二叉樹,最多有2^k-1個結點
3)對任何一棵二叉樹t,如果其葉子結點數為n0,度為2的結點數為n2,則n0=n2+1;
原因:假設度為1的結點數為n1,則n=n0+n1+n2;
接連數總是等於n-1,並且等於n1+2n2;
n-1=n1+2n2可以推出n0+n1+n2-1=n1+n2+n2,推出:n0=n2+1;
4)具有n個結點的完全二叉樹的深度為└log2n」 + 1
二叉樹的儲存:
1.1 連續儲存:(必須是 完全二叉樹)
1.2 鏈式儲存:
一般樹的儲存有一下幾種方法:
雙親表示法:
孩子表示法
雙親孩子表示法
二叉樹表示法:
一般樹轉化二叉樹:任意乙個節點的左指標域指向它的第乙個孩子,右指標域指向它的兄弟
森林的儲存:先把森林轉為二叉樹,再儲存。轉化方法跟一般樹轉二叉樹差不多
二叉樹操作:
1)遍歷:(先中後,指的就是根)
先序遍歷:根、左、右
中序遍歷:左、根、右
後續遍歷:左、右、根
2)已知兩種遍歷序列求原始二叉樹:必須有中序已知
先序遍歷:abcdefgh
中序遍歷:bdceafhg
求後續遍歷
在先序遍歷中,a一定是根節點,而在中序遍歷中可知bdce為a的左子樹,fhg為a的右子樹。而bcde可看出,b為根節點,dce為右子樹。c為根節點,d為左子樹,e為右子樹。以此遞迴可知:
後續遍歷:decbhgfa
資料結構學習(一)
資料結構,是相互之間存在一種或多種特定關係的資料元素的集合,資料結構可以分為邏輯結構和物理結構 邏輯結構 是指資料物件中資料元素之間的相互關係 1.集合結構 集合結構中的資料元素除了屬於同乙個集合外,沒有任何關係 2.線性結構 線性結構中的資料元素是一對一的結構關係 3.樹形結構 樹形結構的資料元素...
資料結構學習 一
資料機構在大學也斷斷續續學過一些,不過到工作時候已經忘了很多,現在想著再重頭學一遍,應該也是為時不晚。資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及它們之間的關係和操作相關的學科。用自己的理解的話來說就是演算法的模型。程式 資料結構 演算法 邏輯結構 資料物件中資料元素之間的相互關係。...
資料結構學習(一)
在生活中很多問題不再是數值計算的數學方程,而是諸如表 樹和圖之類的資料結構。資料結構是數學 演算法和硬體的交集,是一門重要的學科。資料 所有能輸入到計算機中且能被處理的符號總稱,例如影象 聲音等。資料元素 是資料的基本單元,例如整型數 字串等 資料項是資料的最小單位。資料物件 性質相同的資料元素的集...