數(shù)據(jù)結(jié)構(gòu)課程是計算機及相關(guān)專業(yè)的核心專業(yè)基礎(chǔ)課,那么什么是數(shù)據(jù)結(jié)構(gòu)呢?科學百科是這樣定義的: 數(shù)據(jù)結(jié)構(gòu)是計算機存儲、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來更高的運行或者存儲效率。數(shù)據(jù)結(jié)構(gòu)往往與高效的檢索算法和索引技術(shù)有關(guān)。
該定義包含兩重含義,即數(shù)據(jù)結(jié)構(gòu)實現(xiàn)和數(shù)據(jù)結(jié)構(gòu)應(yīng)用。從數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)角度看,數(shù)據(jù)結(jié)構(gòu)是指存在相互關(guān)系的數(shù)據(jù)元素集合,并包含相應(yīng)的數(shù)據(jù)運算,在實現(xiàn)時就需要考慮數(shù)據(jù)的邏輯類型,將這些數(shù)據(jù)以某種合理方式存儲在計算機中,繼而高效地實現(xiàn)對應(yīng)運算的算法。像計算機語言中的數(shù)據(jù)類型都是已經(jīng)實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)。從數(shù)據(jù)結(jié)構(gòu)的應(yīng)用角度看,人們不必關(guān)心數(shù)據(jù)的存儲和運算的具體實現(xiàn)細節(jié),只需要將其作為一個功能包用于求解更復雜的問題,在適當?shù)某橄髮哟紊峡紤]程序的結(jié)構(gòu)和算法。理解和掌握數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)有助于應(yīng)用數(shù)據(jù)結(jié)構(gòu),提高計算機求解問題的能力。
教學內(nèi)容設(shè)計
數(shù)據(jù)結(jié)構(gòu)課程主要以數(shù)據(jù)的邏輯結(jié)構(gòu)為主線,介紹線性表、棧和隊列、樹和二叉樹、圖等數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)和應(yīng)用。該課程一方面培養(yǎng)學生基本的數(shù)據(jù)結(jié)構(gòu)觀,即從邏輯層面理解數(shù)據(jù)結(jié)構(gòu)的邏輯結(jié)構(gòu)特性以及基本運算,繼而合理地實現(xiàn)數(shù)據(jù)結(jié)構(gòu),使之成為像程序設(shè)計語言中那樣可以直接使用的數(shù)據(jù)類型; 另一方面培養(yǎng)學生運用各種數(shù)據(jù)結(jié)構(gòu)的能力,即針對一個較復雜的數(shù)據(jù)處理問題,選擇合適的數(shù)據(jù)結(jié)構(gòu)設(shè)計出好的求解算法。
本書圍繞這兩個目標設(shè)計教學內(nèi)容,總結(jié)編者長期在教學線的教學研究和教學經(jīng)驗,同時參考近年來國內(nèi)外出版的多種數(shù)據(jù)結(jié)構(gòu)教材,考慮教與學的特點,合理地進行知識點取舍和延伸,精心組織編寫而成。本書采用C 語言描述數(shù)據(jù)結(jié)構(gòu)和算法。全書由10章構(gòu)成,各章內(nèi)容如下:
第1章緒論。本章介紹數(shù)據(jù)結(jié)構(gòu)的基本概念、采用C 語言描述算法的方法和特點、算法分析方法和如何設(shè)計好算法等。
第2章線性表。本章介紹線性表的定義、線性表的兩類主要存儲結(jié)構(gòu)和各種基本運算算法設(shè)計; 通過多項式相加的示例討論線性表的應(yīng)用; 介紹STL中的vector和list容器及其使用方法。
第3章棧和隊列。本章介紹棧的定義、棧的存儲結(jié)構(gòu)、棧的各種基本運算算法設(shè)計和棧的應(yīng)用,隊列的定義、隊列的存儲結(jié)構(gòu)、隊列的各種基本運算算法設(shè)計和隊列的應(yīng)用,STL中的stack(棧)、queue(隊列)、deque(雙端隊列)和priority_queue(優(yōu)先隊列)容器及其使用方法。
第4章串。本章介紹串的定義、串的存儲結(jié)構(gòu)和串的各種基本運算算法設(shè)計,STL中的string容器的使用方法,串的模式匹配算法BF和KMP及其應(yīng)用。
第5章數(shù)組和稀疏矩陣。本章介紹數(shù)組的定義、數(shù)組的存儲結(jié)構(gòu)、幾種特殊矩陣的壓縮存儲和稀疏矩陣的壓縮存儲。
第6章遞歸。本章介紹遞歸的定義、遞歸模型、遞歸算法設(shè)計和分析方法,以及遞歸算法轉(zhuǎn)換為非遞歸算法的一般過程。
第7章樹和二叉樹。本章介紹樹的定義、樹的邏輯結(jié)構(gòu)表示方法、樹的性質(zhì)、樹的遍歷和樹的存儲結(jié)構(gòu),二叉樹的定義、二叉樹的性質(zhì)、二叉樹的存儲結(jié)構(gòu)、二叉樹的基本運算算法設(shè)計、二叉樹的遞歸和非遞歸遍歷算法、二叉樹的構(gòu)造、線索二叉樹和哈夫曼樹,樹/森林和二叉樹的轉(zhuǎn)換與還原過程,并查集的定義與實現(xiàn)。
第8章圖。本章介紹圖的定義、圖的存儲結(jié)構(gòu)、圖的基本運算算法設(shè)計、圖的兩種遍歷算法以及圖的應(yīng)用,圖的應(yīng)用包括求小生成樹、短路徑、拓撲排序和關(guān)鍵路徑。
第9章查找。本章介紹查找的定義、線性表上的各種查找算法、各種樹表的查找算法,以及哈希表查找算法及其應(yīng)用、STL中的哈希表容器(如unordered_map和unordered_set)的使用方法。
第10章排序。本章介紹排序的定義、插入排序方法、交換排序方法、選擇排序方法、歸并排序方法和基數(shù)排序方法,以及各種內(nèi)排序方法比較、外排序的基本過程和相關(guān)算法。
教學內(nèi)容緊扣《高等學校計算機專業(yè)核心課程教學實施方案》和《計算機學科碩士研究生入學考試大綱》,涵蓋教學方案及考研大綱要求的全部知識點。書中帶*的章節(jié)或示例為選講或選學內(nèi)容,難度相對較高,供提高者研習。本書的主要特點如下:
① 結(jié)構(gòu)清晰,內(nèi)容豐富,文字敘述簡潔明了,可讀性強。
② 圖文并茂,全書用了300多幅圖表述和講解數(shù)據(jù)的組織結(jié)構(gòu)和算法設(shè)計思想。
③ 力求歸納各類算法設(shè)計的規(guī)律,如單鏈表算法中很多是基于建表算法,二叉樹算法中很多是基于4種遍歷算法,圖算法中很多是基于兩種遍歷算法,如果讀者掌握了相關(guān)的基礎(chǔ)算法,那么對于較復雜的算法設(shè)計就會駕輕就熟。
④ 深入討論遞歸算法設(shè)計方法。遞歸算法設(shè)計是數(shù)據(jù)結(jié)構(gòu)課程中的難點之一,編者從遞歸模型入手,介紹了從求解問題中提取遞歸模型的通用方法,講解了從遞歸模型到遞歸算法設(shè)計的基本規(guī)律。
⑤ 書中提供了大量的教學示例并詳細解析,將抽象概念和抽象的算法過程具體化。
⑥ 結(jié)合知識點提供了若干相關(guān)的實戰(zhàn)題,實戰(zhàn)題來源于力扣(https://leetcodecn.com/)、POJ(http://poj.org/)和HDU(http://acm.hdu.edu.cn/)網(wǎng)站。
⑦ 與C 語言深度結(jié)合,充分利用C 語言的特點實現(xiàn)書中的所有算法,全部算法及其示例均在Dev C 5.1中調(diào)試通過。
⑧ 提供了大量的練習題、上機實驗題和在線編程題,供教學中選用。
教學實驗設(shè)計
教學實驗是提高利用數(shù)據(jù)結(jié)構(gòu)原理解決實際問題必不可少的環(huán)節(jié),本書將實驗教學和理論教學有機結(jié)合,構(gòu)成完整的體系。
① 每章包含基礎(chǔ)實驗和應(yīng)用實驗。基礎(chǔ)實驗屬于驗證性實驗,是上機實現(xiàn)相關(guān)數(shù)據(jù)結(jié)構(gòu)或者算法,用于強化對基本數(shù)據(jù)結(jié)構(gòu)觀的認知; 應(yīng)用實驗屬于設(shè)計或者綜合性實驗,是利用相關(guān)數(shù)據(jù)結(jié)構(gòu)完成較復雜的算法實現(xiàn),用于提高運用各種數(shù)據(jù)結(jié)構(gòu)解決復雜問題的能力。
② 每章包含若干與教學內(nèi)容緊密結(jié)合的、難度適中的在線編程題,所有題目都經(jīng)過精心挑選,均來自力扣、POJ和HDU網(wǎng)站。力扣(中國)是一個極好的學習和實驗在線編程平臺,POJ和HDU是目前國內(nèi)秀的ACM訓練網(wǎng)站。每道在線編程題都提供了多個測試用例,可以對實驗算法進行時間和空間的全方位測試。
配套教學資源
本書配套的輔助教材為《數(shù)據(jù)結(jié)構(gòu)教程(C 語言描述)(第2版)學習與上機實驗指導》和《數(shù)據(jù)結(jié)構(gòu)在線編程實訓(C 語言)(全程視頻講解版)》,前者提供了所有練習題和上機實驗題的解題思路和參考答案,后者提供了所有實戰(zhàn)題和在線編程題的解題思路和參考答案(含全部題目的視頻講解),所有程序均在相關(guān)平臺中驗證通過并給出了時間和空間數(shù)據(jù)。
為了方便教師教學和學生學習,本書提供了全面、豐富的教學資源。配套教學資源包中的內(nèi)容如下:
① 教學PPT。提供全部教學內(nèi)容的精美PPT課件,僅供任課教師在教學中使用。
② 源程序代碼。所有源代碼按章組織,例如ch2文件夾中存放第2章的源代碼,其中,ch2\\Exam23.cpp為例2.3的源代碼。
③ 數(shù)據(jù)結(jié)構(gòu)課程教學大綱和電子教案。包含54學時課堂講授的教學內(nèi)容安排和18學時實驗的實驗教學內(nèi)容安排,供教師參考。
④ 在線作業(yè)。包括選擇題、判斷題、填空題、簡答題和編程題。
⑤ 書中配套絕大部分知識點的教學視頻,視頻采用微課碎片化形式組織(含266個小視頻,累計超過45小時)。
資源下載提示
課件等資源: 掃描封底的課件下載二維碼,在公眾號書圈下載。
素材(源碼)等資源: 掃描目錄上方的二維碼下載。
在線作業(yè): 掃描封底作業(yè)系統(tǒng)二維碼,登錄網(wǎng)站在線做題及查看答案。
視頻等資源: 掃描封底刮刮卡中的二維碼,再掃描書中相應(yīng)章節(jié)中的二維碼,可以在線學習。
本書第2、3、6、7和10章由李春葆編寫,第1、4和5章由匡志強編寫,第8和9章由蔣林編寫,李春葆完成全書的規(guī)劃和統(tǒng)稿工作。本書的出版得到清華大學出版社魏江江分社長的全力支持,王冰飛老師給予精心編輯,力扣(中國)網(wǎng)站提供了無私的幫助,編者在此一并表示衷心的感謝。盡管編者不遺余力,但由于水平所限,本書難免存在不足之處,敬請教師和同學們批評指正,在此表示衷心的感謝。
編者2021年5月
第1章緒論
1.1什么是數(shù)據(jù)結(jié)構(gòu)
1.1.1數(shù)據(jù)結(jié)構(gòu)的定義
1.1.2數(shù)據(jù)的邏輯結(jié)構(gòu)
1.1.3數(shù)據(jù)的存儲結(jié)構(gòu)
1.1.4數(shù)據(jù)的運算
1.1.5數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類型
1.2算法及其描述
1.2.1什么是算法
1.2.2算法描述
1.2.3C 語言描述算法的要點
1.3算法分析
1.3.1算法的設(shè)計目標
1.3.2算法的時間性能分析
1.3.3算法的存儲空間分析
1.4數(shù)據(jù)結(jié)構(gòu)的目標
1.5練習題
1.5.1問答題
1.5.2算法設(shè)計題
1.6上機實驗題
1.6.1基礎(chǔ)實驗題
1.6.2應(yīng)用實驗題
1.7在線編程題
第2章線性表
2.1線性表的定義
2.1.1什么是線性表
2.1.2線性表的抽象數(shù)據(jù)類型描述
2.2線性表的順序存儲結(jié)構(gòu)
2.2.1線性表的順序存儲結(jié)構(gòu)順序表
2.2.2線性表基本運算算法在順序表中的實現(xiàn)
2.2.3順序表的應(yīng)用算法設(shè)計示例
2.3線性表的鏈式存儲結(jié)構(gòu)
2.3.1鏈表
2.3.2單鏈表
2.3.3單鏈表的應(yīng)用算法設(shè)計示例
2.3.4雙鏈表
2.3.5雙鏈表的應(yīng)用算法設(shè)計示例
2.3.6循環(huán)鏈表
2.4順序表和鏈表的比較
2.5線性表的應(yīng)用兩個多項式相加
2.5.1問題描述
2.5.2問題求解
2.6STL中的線性表
2.6.1vector向量容器
2.6.2list鏈表容器
2.7練習題
2.7.1問答題
2.7.2算法設(shè)計題
2.8上機實驗題
2.8.1基礎(chǔ)實驗題
2.8.2應(yīng)用實驗題
2.9在線編程題
第3章棧和隊列
3.1棧
3.1.1棧的定義
3.1.2棧的順序存儲結(jié)構(gòu)及其基本運算算法的實現(xiàn)
3.1.3順序棧的應(yīng)用算法設(shè)計示例
3.1.4棧的鏈式存儲結(jié)構(gòu)及其基本運算算法的實現(xiàn)
3.1.5鏈棧的應(yīng)用算法設(shè)計示例
3.1.6STL中的stack棧容器
3.1.7棧的綜合應(yīng)用
3.2隊列
3.2.1隊列的定義
3.2.2隊列的順序存儲結(jié)構(gòu)及其基本運算算法的實現(xiàn)
3.2.3循環(huán)隊列的應(yīng)用算法設(shè)計示例
3.2.4隊列的鏈式存儲結(jié)構(gòu)及其基本運算算法的實現(xiàn)
3.2.5鏈隊的應(yīng)用算法設(shè)計示例
3.2.6STL中的queue隊列容器
3.2.7隊列的綜合應(yīng)用
3.2.8STL中的雙端隊列和優(yōu)先隊列
3.3*棧和隊列的擴展單調(diào)棧和單調(diào)隊列
3.3.1單調(diào)棧
3.3.2單調(diào)隊列
3.4練習題
3.4.1問答題
3.4.2算法設(shè)計題
3.5上機實驗題
3.5.1基礎(chǔ)實驗題
3.5.2應(yīng)用實驗題
3.6在線編程題
第4章串
4.1串的定義
4.2串的存儲結(jié)構(gòu)
4.2.1串的順序存儲結(jié)構(gòu)順序串
4.2.2串的鏈式存儲結(jié)構(gòu)鏈串
4.3STL中的string
4.4串的模式匹配
4.4.1BF算法
4.4.2KMP算法
4.5練習題
4.5.1問答題
4.5.2算法設(shè)計題
4.6上機實驗題
4.6.1基礎(chǔ)實驗題
4.6.2應(yīng)用實驗題
4.7在線編程題
第5章數(shù)組和稀疏矩陣
5.1數(shù)組
5.1.1數(shù)組的基本概念
5.1.2數(shù)組的存儲結(jié)構(gòu)
5.1.3數(shù)組的應(yīng)用
5.2特殊矩陣的壓縮存儲
5.2.1對稱矩陣的壓縮存儲
5.2.2三角矩陣的壓縮存儲
5.2.3對角矩陣的壓縮存儲
5.3稀疏矩陣
5.3.1稀疏矩陣的三元組表示
5.3.2稀疏矩陣的十字鏈表表示
5.4練習題
5.4.1問答題
5.4.2算法設(shè)計題
5.5上機實驗題
5.5.1基礎(chǔ)實驗題
5.5.2應(yīng)用實驗題
5.6在線編程題
第6章遞歸
6.1什么是遞歸
6.1.1遞歸的定義
6.1.2何時使用遞歸
6.1.3遞歸模型
6.1.4遞歸與數(shù)學歸納法
6.1.5遞歸的執(zhí)行過程
6.1.6遞歸算法的時空分析
6.2遞歸算法設(shè)計
6.2.1遞歸算法設(shè)計的步驟
6.2.2基于遞歸數(shù)據(jù)結(jié)構(gòu)的遞歸算法設(shè)計
6.2.3基于歸納方法的遞歸算法設(shè)計
6.3遞歸算法轉(zhuǎn)換為非遞歸算法
6.3.1迭代轉(zhuǎn)換法
6.3.2用棧模擬轉(zhuǎn)換法
6.4練習題
6.4.1問答題
6.4.2算法設(shè)計題
6.5上機實驗題
6.5.1基礎(chǔ)實驗題
6.5.2應(yīng)用實驗題
6.6在線編程題
第7章樹和二叉樹
7.1樹
7.1.1樹的定義
7.1.2樹的邏輯結(jié)構(gòu)表示方法
7.1.3樹的基本術(shù)語
7.1.4樹的性質(zhì)
7.1.5樹的基本運算
7.1.6樹的存儲結(jié)構(gòu)
7.2二叉樹
7.2.1二叉樹的概念
7.2.2二叉樹的性質(zhì)
7.2.3二叉樹的存儲結(jié)構(gòu)
7.2.4二叉樹的遞歸算法設(shè)計
7.2.5二叉樹的基本運算算法及其實現(xiàn)
7.3二叉樹的先序、中序和后序遍歷
7.3.1二叉樹遍歷的概念
7.3.2先序、中序和后序遍歷遞歸算法
7.3.3遞歸遍歷算法的應(yīng)用
7.3.4先序、中序和后序遍歷非遞歸算法
7.4二叉樹的層次遍歷
7.4.1層次遍歷的過程
7.4.2層次遍歷算法的設(shè)計
7.4.3層次遍歷算法的應(yīng)用
7.5二叉樹的構(gòu)造
7.5.1由先序/中序序列或后序/中序序列構(gòu)造二叉樹
7.5.2*序列化和反序列化
7.6線索二叉樹
7.6.1線索二叉樹的定義
7.6.2線索化二叉樹
7.6.3遍歷線索化二叉樹
7.7哈夫曼樹
7.7.1哈夫曼樹的定義
7.7.2哈夫曼樹的構(gòu)造算法
7.7.3哈夫曼編碼
7.8樹/森林與二叉樹之間的轉(zhuǎn)換及還原
7.8.1一棵樹與二叉樹的轉(zhuǎn)換及還原
7.8.2森林與二叉樹的轉(zhuǎn)換及還原
7.9*并查集
7.9.1并查集的定義
7.9.2并查集的實現(xiàn)
7.10練習題
7.10.1問答題
7.10.2算法設(shè)計題
7.11上機實驗題
7.11.1基礎(chǔ)實驗題
7.11.2應(yīng)用實驗題
7.12在線編程題
第8章圖
8.1圖的基本概念
8.1.1圖的定義
8.1.2圖的基本術(shù)語
8.2圖的存儲結(jié)構(gòu)
8.2.1鄰接矩陣
8.2.2鄰接表
8.3圖的遍歷
8.3.1圖遍歷的概念
8.3.2深度優(yōu)先遍歷
8.3.3廣度優(yōu)先遍歷
8.3.4非連通圖的遍歷
8.4圖遍歷算法的應(yīng)用
8.4.1深度優(yōu)先遍歷算法的應(yīng)用
8.4.2*回溯法及其應(yīng)用
8.4.3廣度優(yōu)先遍歷算法的應(yīng)用
8.5生成樹和小生成樹
8.5.1生成樹和小生成樹的概念
8.5.2普里姆算法
8.5.3克魯斯卡爾算法
8.6短路徑
8.6.1短路徑的概念
8.6.2狄克斯特拉算法
8.6.3弗洛伊德算法
8.7拓撲排序
8.7.1什么是拓撲排序
8.7.2拓撲排序算法的設(shè)計
8.8AOE網(wǎng)和關(guān)鍵路徑
8.8.1什么是AOE網(wǎng)
8.8.2求AOE網(wǎng)的關(guān)鍵路徑
8.9練習題
8.9.1問答題
8.9.2算法設(shè)計題
8.10上機實驗題
8.10.1基礎(chǔ)實驗題
8.10.2應(yīng)用實驗題
8.11在線編程題
第9章查找
9.1查找的基本概念
9.2線性表的查找
9.2.1順序查找
9.2.2折半查找
9.2.3索引存儲結(jié)構(gòu)和分塊查找
9.3樹表的查找
9.3.1二叉排序樹
9.3.2平衡二叉樹
9.3.3*STL中的關(guān)聯(lián)容器
9.3.4B樹
9.3.5B 樹
9.4哈希表的查找
9.4.1哈希表的基本概念
9.4.2哈希函數(shù)的構(gòu)造方法
9.4.3哈希沖突的解決方法
9.4.4哈希表查找及性能分析
9.4.5*STL中的哈希表
9.5練習題
9.5.1問答題
9.5.2算法設(shè)計題
9.6上機實驗題
9.6.1基礎(chǔ)實驗題
9.6.2應(yīng)用實驗題
9.7在線編程題
第10章排序
10.1排序的基本概念
10.2插入排序
10.2.1直接插入排序
10.2.2折半插入排序
10.2.3希爾排序
10.3交換排序
10.3.1冒泡排序
10.3.2快速排序
10.4選擇排序
10.4.1簡單選擇排序
10.4.2堆排序
10.4.3堆數(shù)據(jù)結(jié)構(gòu)
10.5歸并排序
10.5.1自底向上的二路歸并排序
10.5.2自頂向下的二路歸并排序
10.6基數(shù)排序
10.7各種內(nèi)排序方法的比較和選擇
10.8外排序
10.8.1生成初始歸并段的方法
10.8.2多路歸并方法
10.9練習題
10.9.1問答題
10.9.2算法設(shè)計題
10.10上機實驗題
10.10.1基礎(chǔ)實驗題
10.10.2應(yīng)用實驗題
10.11在線編程題
參考文獻