數據結構複習

數據結構複習

1.棧

棧可以用多種方法實現:
  • 數組+計數器(記錄棧容量)
  • 標準庫中的 Vector 容器
  • 鏈表+計數器
  • 標準庫中的 Stack 數據結構
棧的應用:
  • 括號匹配

    括號入棧前與棧頂括號比較,若匹配則棧頂元素彈出,否則繼續入棧。

  • 設計鏈棧

    注意棧的poppush操作都是在表頭進行。

  • 設計支持返回棧中最大值的棧

    使用輔助棧存儲當前棧中的最大值。當入棧元素大於輔助棧棧頂元素時將該元素也壓入輔助棧;當要彈出的棧頂元素等於輔助棧棧頂元素時,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出發由上而下,結點之間存在的遍歷路徑。
  • lengthpath的長度。
  • depthleaf結點到root結點的最長path中的邊個數。
  • heightleaf結點到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)其中vw是2個點,e是由vw爲端點構成的邊。那麼,稱邊e和點vw是鄰接Incident關係;稱點vw是相鄰Adjacent關係。

  • path:相鄰關係的點及其邊構成的集合。

  • cyclepath是一個圓環。

  • degree:與一個點相鄰的點的個數(也是與一個點鄰接的邊的條數)。

圖的性質
  • connected:任意點對之間都存在邊。
    對於一個digraphstrongly 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章