-
>
闖進數學世界――探秘歷史名題
-
>
中醫基礎理論
-
>
當代中國政府與政治(新編21世紀公共管理系列教材)
-
>
高校軍事課教程
-
>
思想道德與法治(2021年版)
-
>
毛澤東思想和中國特色社會主義理論體系概論(2021年版)
-
>
中醫內科學·全國中醫藥行業高等教育“十四五”規劃教材
算法與數據結構 版權信息
- ISBN:9787302539667
- 條形碼:9787302539667 ; 978-7-302-53966-7
- 裝幀:平裝
- 冊數:暫無
- 重量:暫無
- 所屬分類:>>
算法與數據結構 本書特色
全書系統介紹了算法與數據結構方面的基本知識,重點闡述了基本數據結構及算法在程序開發中的應用方法。通過深入地學習和分析,能夠幫助讀者極大地提高軟件開發和設計能力。
算法與數據結構 內容簡介
本書主要內容有: 數據結構和算法的基本概念和術語; 線性表、樹和圖的邏輯結構、存儲結構及應用實例, 包括與隊列數組與字符串等特殊線性表:查找與排序操作的常用算法; 蠻力算法、分治算法、動態規劃算法、貪心算法、回溯算法及分枝限界算法等常用算法設計技術。
算法與數據結構 目錄
第1章 緒論
1.1 數據結構的基本概念與學習方法
1.1.1 數據結構的研究對象
1.1.2 數據結構的基本概念和基本術語
1.2 算法與數據結構
1.2.1 算法的概念
1.2.2 描述算法的方法
1.2.3 算法分析
1.3 學習算法與數據結構的意義和方法
1.4 C語言的數據類型及其算法描述
1.4.1 C語言的基本數據類型概述
1.4.2 C語言的數組和結構體數據類型
1.4.3 C語言的指針類型概述
1.4.4 C語言的函數
1.4.5 用C語言驗證算法的方法
1.5 從C語言到C++語言
1.5.1 C++語言的類和抽象數據類型
1.5.2 C++語言驗證算法的方法
1.5.3 C++語言與C語言程序的區別
1.5.4 C++語言的重要特性
習題1
上機練習1
第2章 線性表
2.1 線性表的邏輯結構
2.1.1 線性表的定義
2.1.2 線性表的運算
2.2 線性表的順序存儲結構——順序表
2.2.1 順序表
2.2.2 順序存儲結構的優缺點
2.2.3 順序表上的基本運算
2.3 線性表的鏈式存儲結構——鏈表
2.3.1 單鏈表
2.3.2 循環鏈表和雙向鏈表
2.4 線性表的應用示例
2.5 C++中的線性表
2.5.1 C++中線性表抽象數據類型
2.5.2 C++中線性表的順序存儲
2.5.3 C++中線性表的鏈式存儲
習題2
上機練習2
第3章 棧和隊列
3.1 棧
3.1.1 棧的基本概念
3.1.2 棧的順序存儲結構
3.1.3 棧的鏈式存儲結構
3.2 棧的應用實例
3.2.1 表達式求值
3.2.2 棧與函數調用
3.2.3 棧在回溯法中的應用
3.3 隊列
3.3.1 隊列的基本概念
3.3.2 隊列的順序存儲結構
3.3.3 隊列的鏈式存儲結構
3.4 隊列的應用實例
3.4.1 舞伴問題
3.4.2 打印隊列的模擬管理
3.5 遞歸
3.5.1 遞歸的定義及遞歸模型
3.5.2 遞歸的實現
3.5.3 遞歸設計
3.5.4 遞歸到非遞歸的轉換
3.6 C++中的棧和隊列
3.6.1 C++中的棧
3.6.2 C++中的隊列
習題3
上機練習3
第4章 數組和字符串
4.1 數組
4.1.1 數組的定義與操作
4.1.2 數組的順序存儲結構
4.1.3 矩陣的壓縮存儲方法
4.2 字符串
4.2.1 字符串的定義與操作
4.2.2 字符串的存儲結構
4.2.3 字符串基本操作的實現
4.2.4 字符串的應用舉例
4.3 C++中的數組和字符串
4.3.1 C++中的數組
4.3.2 C++中的字符串
習題4
上機練習4
第5章 樹
5.1 樹的概念與操作
5.1.1 樹的概念
5.1.2 樹的基本操作
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 線索二叉樹的常用運算
5.5 一般樹的表示和遍歷
5.5.1 一般樹的表示
5.5.2 二叉樹與樹、森林之間的轉換
5.5.3 一般樹的遍歷
5.6 哈夫曼樹及其應用
5.6.1 哈夫曼樹
5.6.2 哈夫曼樹的應用
5.7 C++中的樹
5.7.1 C++中的二叉樹結點類
5.7.2 C++中的二叉樹類
5.7.3 C++中二叉樹的非遞歸遍歷
習題5
上機練習5
第6章 圖
6.1 圖的概念與操作
6.1.1 圖的定義
6.1.2 圖的基本術語
6.2 圖的存儲結構
6.2.1 鄰接矩陣
6.2.2 鄰接表
6.2.3 十字鏈表
6.2.4 邊集數組
6.3 圖的遍歷
6.3.1 深度優先搜索
6.3.2 廣度優先搜索
6.4 圖的連通性
6.4.1 無向圖的連通分量
6.4.2 生成樹和*小代價生成樹
6.5 有向無環圖及應用
6.5.1 拓撲排序
6.5.2 關鍵路徑
6.6 *短路徑及應用
6.6.1 單源*短路徑
6.6.2 每對頂點之間的*短路徑
6.7 C++中的圖
6.7.1 C++中的圖類
6.7.2 圖的鄰接表的C++程序
6.7.3 圖的遍歷的C++程序
6.7.4 圖的*小生成樹的C++程序
習題6
上機練習6
第7章 查找
7.1 基本概念與術語
7.2 靜態查找表
7.2.1 靜態查找表結構
7.2.2 順序查找
7.2.3 有序表的折半查找
7.2.4 有序表的插值查找和斐波那契查找
7.2.5 分塊查找
7.3 動態查找表
7.3.1 二叉排序樹
7.3.2 平衡二叉樹
7.3.3 B樹和B+樹
7.4 哈希表查找
7.4.1 哈希表與哈希方法
7.4.2 常用的哈希方法
7.4.3 處理沖突的方法
7.4.4 哈希表的查找分析
7.5 C++中的查找
7.5.1 靜態查找的C++程序
7.5.2 動態查找的C++程序
習題7
上機練習7
第8章 排序
8.1 基本概念
8.2 插入排序
8.2.1 直接插入排序
8.2.2 希爾排序
8.3 交換排序
8.3.1 冒泡排序
8.3.2 快速排序
8.4 選擇排序
8.4.1 簡單選擇排序
8.4.2 堆排序
8.5 歸并排序
*8.6 基數排序
*8.7 外部排序簡介
8.7.1 外存信息的存取
8.7.2 外部排序的基本方法
8.8 C++中的排序
習題8
上機練習8
第9章 常用算法設計技術
9.1 蠻力算法
9.1.1 蠻力算法思想
9.1.2 蠻力算法應用實例——*近對問題
9.2 分治算法
9.2.1 分治算法思想
9.2.2 分治算法設計
9.2.3 分治算法設計應用實例——棋盤覆蓋問題
9.3 動態規劃算法
9.3.1 動態規劃算法思想及設計
9.3.2 動態規劃算法應用實例——0/1背包問題
9.4 貪心算法
9.4.1 貪心算法技術思想
9.4.2 貪心算法設計
9.4.3 貪心算法應用實例——背包問題
9.5 回溯算法
9.5.1 回溯算法有關概念
9.5.2 回溯算法思想
9.5.3 回溯算法設計
9.5.4 回溯算法應用實例——裝載問題
9.6 分支限界算法
9.6.1 分支限界算法思想
9.6.2 分支限界算法設計
9.6.3 分支限界算法應用實例——任務分配問題
習題9
上機練習9
第10章 標準模板庫
10.1 STL簡介
10.1.1 容器
10.1.2 迭代器
10.1.3 算法
10.2 STL應用實例
10.2.1 雙向鏈表操作的STL實現
10.2.2 STL測試程序
習題10
上機練習10
參考文獻
算法與數據結構 節選
第3章棧和隊列 本章學習要點 (1) 掌握棧和隊列這兩種數據結構的特點,了解在什么問題中應該使用哪種結構。 (2) 熟悉棧(隊列)和線性表的關系、順序棧(順序隊列)和順序表的關系、鏈棧(鏈隊列)和鏈表的關系。 (3) 重點掌握在順序棧和鏈棧上實現的棧的7種基本運算,特別注意棧滿和棧空的條件及它們的描述。 (4) 重點掌握在循環隊列和鏈隊列上實現的7種基本運算,應特別注意隊滿和隊空的描述方法。 (5) 熟悉棧和隊列的下溢和上溢的概念; 順序隊列中產生假上溢的原因; 循環隊列消除假上溢的方法。 (6) 了解遞歸算法執行過程中工作記錄的變化情況。 棧和隊列與線性表有著密切的聯系,一方面,棧和隊列的邏輯結構也是線性結構; 另一方面,棧和隊列的基本操作是線性表操作的子集,因此,可將棧和隊列看成兩種特殊的線性表。 3.1棧 3.1.1棧的基本概念 日常生活中有不少類似于棧(如圖3.1(a)所示)的例子。假設有一個很窄的死胡同,其寬度只能容納一輛車,現有5輛車,分別編號為①~⑤,按編號順序依次進入此胡同,若要退出④,必須先退出⑤; 若要退出①必須將⑤、④、③、②依次都退出才行。這個死胡同就是一個棧,如圖3.1(b)所示。 圖3.1棧及其示例 棧(stack)是允許僅在表的一端進行插入和刪除操作的線性表。允許進行插入和刪除的一端稱為棧頂(top),不允許插入和刪除的一端稱為棧底(bottom)。不含元素的空表稱為空棧。 假設棧S=(a1,a2,…,an),如圖3.1(a)所示,a1為棧底元素,an為棧頂元素。棧中元素按a1,a2,…,an的次序進棧,退棧的**個元素應為棧頂元素。也就是說,棧的特點是后進先出(last in first out,LIFO),因此,棧又稱為后進先出的線性表,簡稱LIFO線性表。 在已知棧的邏輯結構和確定常用運算后,就可以定義棧的抽象數據類型。 ADT3.1是棧的抽象數據類型描述,其中包含*常見的棧運算。 ADT3.1棧ADT ADT stack{ 數據對象: D={ai|ai∈元素集合,i=1,2,…,n,n≥0} 數據關系: R1={〈ai-1,ai〉|ai-1,ai∈D,i=2,…,n},約定an端為棧頂,a1為棧底。 基本操作: InitStack(): 創建一個空棧。 Destroy(): 撤銷一個棧。 StackEmpty(): 若棧空,則返回1,否則返回0。 StackFull(): 若棧滿,則返回1,否則返回0。 Top(x): 在x中返回棧頂元素。若操作成功,則返回1,否則返回0。 Push(): 在棧頂插入元素x(入棧)。若操作成功,則返回1,否則返回0。 Pop(): 從棧中刪除棧頂元素(出棧)。若操作成功,則返回1,否則返回0。 Clear(): 清除棧中全部元素。 }ADT stack 圖3.2十進制數35轉換成 二進制數的過程 棧的應用非常廣泛,例如進位記數制之間的轉換問題。在將十進制數轉換成二進制數時,常采用除法。用初始十進制數除以2,把余數記錄下來,若商不為0,則再用商去除以2,直到商為0,這時把所有的余數按出現的逆序排列起來(先出現的余數排在后面,后出現的余數排在前面)就得到了相應的二進制數。例如把十進制數35轉換成二進制數的過程如圖3.2所示。 根據上述操作的描述,可以采用一個棧來保存所有的余數,當商為0時讓棧中的所有余數出棧,這樣就得到了正確的二進制數。 算法3.1十進制數轉換成二進制數算法。 void conversion() { Stack S; int n; InitStack(&S); printf("Input a number to convert:\n"); scanf("%d",&n); if(n<0) { printf("\nThe number must be over 0."); return 0; } if(n==0) Push(&S,0); while(n!=0) { Push(&S,n%2); n=n/2; } printf("the result is: "); while(!StackEmpty(&S)) { printf("%d", Pop(&S)); } }
算法與數據結構 作者簡介
主編先后主講數據結構、算法設計與分析、程序設計基礎、計算機組成原理等課程,同時悉心指導課程設計和畢業設計,積極指導學生課外科技活動。在教學中形成了獨特的教學風格,教學經驗豐富,受到師生好評,在教學質量排名中一直位居前20%;作為重慶理工大學精品課程《數據結構》負責人,對課程建設作了大量工作。 主編始終站在教學、科研一線,積極參加教育教學改革和科學研究,主編出版《算法與數據結構》等教材4部,參編4部;在國內外學術期刊和國際會議上公開發表論文40余篇,其中被EI、ISTP檢索7篇;主持并完成“光通訊網絡互連技術研究”等省部級科研項目4項,參與20余項;主持并完成“地方高校程序設計系列課程改革研究與實踐”、“地方高校專業學位研究生算法設計案例庫的建設研究”等教研項目4項;獲重慶市自然科學三等獎1項、重慶市教學成果三等獎1項、校優秀教學成果2項;多次獲得校“教學工作優秀教師”等獎項。
- >
姑媽的寶刀
- >
龍榆生:詞曲概論/大家小書
- >
月亮與六便士
- >
自卑與超越
- >
名家帶你讀魯迅:故事新編
- >
月亮虎
- >
羅庸西南聯大授課錄
- >
山海經