數據結構複習
1.棧
棧可以用多種方法實現:
- 數組+計數器(記錄棧容量)
- 標準庫中的
Vector
容器 - 鏈表+計數器
- 標準庫中的
Stack
數據結構
棧的應用:
括號匹配
括號入棧前與棧頂括號比較,若匹配則棧頂元素彈出,否則繼續入棧。
設計鏈棧
注意棧的
pop
和push
操作都是在表頭進行。設計支持返回棧中最大值的棧
使用輔助棧存儲當前棧中的最大值。當入棧元素大於輔助棧棧頂元素時將該元素也壓入輔助棧;當要彈出的棧頂元素等於輔助棧棧頂元素時,2個棧頂元素都彈出。
後綴表達式計算
數字入棧,遇到運算符號時取出棧頂2個元素完成運算並將結果入棧直至得到最終結果。
BST中序遍歷
BST結點入棧,遇到沒有子結點的棧頂元素時連續彈出2個棧頂元素。
記錄Hanoi Tower移動
進制轉換
將轉換(先
%
運算再/
運算)後的低位數依次,最後依次出棧完成轉換。
2.隊列
隊列可以用多種方法實現:
- 數組+計數器(記錄隊列容量)
- 標準庫中的
Queue
容器
-數組(環狀數組實現)+隊頭下標+隊尾下標+計數器
隊列的應用:
迴文判斷
字符串分別放入隊列和棧,然後依次出棧和出隊列,比較2個元素是否相同。
使用雙棧模擬隊列
一個棧負責
pop
,另一個棧負責push
。BST的廣度有限搜索
依次將結點放入隊列,然後按照隊列中的順序將該結點的子結點依次放入新的隊列,並將該結點出隊。
3.鏈表
鏈表直接使用基於指針的結構體進行構建。
struct Node{
void* value;
Node* leftSub;
Node* rightSub;
void* otherInfo;
};
鏈表的應用:
基數排序
生成編號爲0到9這10個鏈表,然後自數字的低位到高位不斷刷新鏈表內容,最後按照編號從小到大輸出鏈表中的值,即可完成升序排列。
判斷單向鏈表是否有環
設置2個指針(一個慢指針、一個快指針)對該鏈表進行遍歷,如果遇到2個指針重疊,那麼該鏈表存在環(證僞不證實)。
翻轉鏈表
遍歷原始鏈表,同時新建鏈表,將每次遍歷到的結點更新爲新鏈表的頭結點。
有序鏈表去重
判斷相鄰結點是否相同,相同則刪除其中一個結點。
有序鏈表合併
依次遍歷,(以升序爲例)比較2個鏈表的當前結點誰小取誰放入新的鏈表,然後比較後一結點。
倒數第k個結點
使用2個指針,快指針先遍歷k個結點,再和慢指針一起遍歷,當快指針訪問到鏈表尾部NULL時,慢指針的位置就是倒數第k個結點。
2個單鏈表中相同結點的檢查
尾結點相同,則2個單鏈表中存在相同結點。
4.散列表Hash Table
散列表包含2個重點:
- 散列函數
1.直接定址
2.除留餘數
3.平方取中
4.摺疊法(針對位數較多的關鍵碼)
5.數字分析
6.隨機數
- 衝突處理
1.開放地址法 Open Addressing
(1)線性探查 Linear Probing
(2)二次探查 Quadratic Probing
2.分塊鏈接 Chaining
(1)鏈地址
(2)拉鍊法
5.樹與二叉搜索樹
樹tree
的關鍵概念:
path
:從root出發由上而下,結點之間存在的遍歷路徑。length
:path
的長度。depth
:leaf
結點到root
結點的最長path
中的邊個數。height
:leaf
結點到root
結點的最長path
中的結點個數。level
:結點到root
的路徑長度。
樹的性質:
complete
:每一個結點,要麼沒有子節點,要麼有左右2個結點。balanced
:左右子樹的height
相同。
二叉搜索樹BST的3種遍歷順序(形成3種表達式):
- 前序遍歷
pre-oder
- 中序遍歷
in-order
- 後序遍歷
post-order
有關樹的問題
AVL平衡樹的結點插入與平衡旋轉
森林
Forest
的遍歷森林
Forest
的並查集Disjoint-Set
6.圖Graph
圖的組成
G={V,E}
其中V
表示點vertex
組成的集合,E
表示邊edge
組成的集合。
e=(v,w)
其中v
和w
是2個點,e
是由v
和w
爲端點構成的邊。那麼,稱邊e
和點v
、w
是鄰接Incident
關係;稱點v
和w
是相鄰Adjacent
關係。
path
:相鄰關係的點及其邊構成的集合。cycle
:path
是一個圓環。degree
:與一個點相鄰的點的個數(也是與一個點鄰接的邊的條數)。
圖的性質
connected
:任意點對之間都存在邊。
對於一個digraph
,strongly connected
強連通是指考慮方向時,圖是connected
連通的;weakly connected
弱連通是指不考慮方向時,剩下的無向圖是connected
連通的。free
:圖中不存在環。dense
稠密與sparse
稀疏:當邊數與點數相近時,稱爲dense
稠密圖;當邊數<<點數時,稱爲sparse
稀疏圖。simple graph
:不存在多重邊的圖。Directed Acyclic Graph
:有向無環圖DAG
圖的遍歷
- 深度優先遍歷
Depth-First
void DF(Node* n)
{
if(n == NULL)
{
//Stop searching
}
current_node_set_visited();
display_current_node();
DF(n->lson);
DF(n->rson);
}
- 廣度優先遍歷
Breadth-First
void BF(Node* root)
{
queue<Node> oldQueue;
oldQueue.push(root);
while(!oldQueue.empty())
{
queue<Node> tempQueue;
for(int i = 0; i < oldQueue.size(); i++)
{
InsertToTempQueue((*(oldQueue.front().lson)));
InsertToTempQueue((*(oldQueue.front().rson)));
displayNodeInfo(oldQueue.front());
oldQueue.pop();
}
oldQueue = tempQueue;
}
}
圖的應用
最短路徑
Shortest Path
(1)不帶權重的圖:Breadth-First Searching (2)帶權重的圖:Dijkstra's Algorithm
最小生成樹
Minimal Spanning Tree
(1)Prim's Algorithm (2)Kruskal's Algorithm
圖的並查集操作
Disjoint-Set Operation
拓撲排序
Topological Sort
搜索連通分支
Connected Component