出 版 說 明
信息時代早已顯現(xiàn)其誘人魅力,當前幾乎每個人隨身都攜有多個媒體、信息和通信設備,享受其帶來的快樂和便宜。
我國高等教育早已進入大眾化教育時代。而且計算機技術發(fā)展很快,知識更新速度也在快速增長,社會對計算機專業(yè)學生的專業(yè)能力要求也在不斷翻新。這就使得我國目前的計算機教育面臨嚴峻挑戰(zhàn)。我們必須更新教育觀念——弱化知識培養(yǎng)目的,強化對學生興趣的培養(yǎng),加強培養(yǎng)學生理論學習、快速學習的能力,強調培養(yǎng)學生的實踐能力、動手能力、研究能力和創(chuàng)新能力。
教育觀念的更新,必然伴隨教材的更新。一流的計算機人才需要一流的名師指導,而一流的名師需要精品教材的輔助,而精品教材也將有助于催生更多一流名師。名師們在長期的一線教學改革實踐中,總結出了一整套面向學生的獨特的教法、經(jīng)驗、教學內容等。本套叢書的目的就是推廣他們的經(jīng)驗,并促使廣大教育工作者更新教育觀念。
在教育部相關教學指導委員會專家的幫助和指導下,在各大學計算機院系領導的協(xié)助下,清華大學出版社規(guī)劃并出版了本系列教材,以滿足計算機課程群建設和課程教學的需要,并將各重點大學的優(yōu)勢專業(yè)學科的教育優(yōu)勢充分發(fā)揮出來。
本系列教材行文注重趣味性,立足課程改革和教材創(chuàng)新,廣納全國高校計算機優(yōu)秀一線專業(yè)名師參與,從中精選出佳作予以出版。
本系列教材具有以下特點。
1. 有的放矢
針對計算機專業(yè)學生并站在計算機課程群建設、技術市場需求、創(chuàng)新人才培養(yǎng)的高度,規(guī)劃相關課程群內各門課程的教學關系,以達到教學內容互相銜接、補充、相互貫穿和相互促進的目的。各門課程功能定位明確,并去掉課程中相互重復的部分,使學生既能夠掌握這些課程的實質部分,又能節(jié)約一些課時,為開設社會需求的新技術課程準備條件。
2. 內容趣味性強
按照教學需求組織教學材料,注重教學內容的趣味性,在培養(yǎng)學習觀念、學習興趣的同時,注重創(chuàng)新教育,加強“創(chuàng)新思維”,“創(chuàng)新能力”的培養(yǎng)、訓練;強調實踐,案例選題注重實際和興趣度,大部分課程各模塊的內容分為基本、加深和拓寬內容3個層次。
3. 名師精品多
廣羅名師參與,對于名師精品,予以重點扶持,教輔、教參、教案、PPT、實驗大綱和實驗指導等配套齊全,資源豐富。同一門課程,不同名師分出多個版本,方便選用。
4. 一線教師親力
專家咨詢指導,一線教師親力;內容組織以教學需求為線索;注重理論知識學習,注重學習能力培養(yǎng),強調案例分析,注重工程技術能力鍛煉。
經(jīng)濟要發(fā)展,國力要增強,教育必須先行。教育要靠教師和教材,因此建立一支高水平的教材編寫隊伍是社會發(fā)展的關鍵,特希望有志于教材建設的教師能夠加入到本團隊。通過本系列教材的輻射,培養(yǎng)一批熱心為讀者奉獻的編寫教師團隊。
清華大學出版社前言
“數(shù)據(jù)結構與算法”課程涉及的內容十分豐富,包含了計算機科學與技術專業(yè)的許多重要知識,許多分析、解決問題的方法新穎,技巧性強,對學生計算機軟件素質的培養(yǎng)作用明顯。為培養(yǎng)、訓練學生選用合適的數(shù)據(jù)結構與算法設計方法編寫質量高、風格好的應用程序,學生需要不斷地進行編程實踐,將實驗與課程設計實踐環(huán)節(jié)與理論教學相融合,通過實踐教學促進數(shù)據(jù)結構與算法理論知識的學習,有效提高教學效果和教學水平。
本書是游洪躍、唐寧九主編,清華大學出版社出版的《數(shù)據(jù)結構與算法(C++版)(第2版)》(ISBN 9787302557746,后面簡稱為主教材)的配套教材。全書分為3部分,具體如下。
第1部分總結了主教材所述的數(shù)據(jù)結構與算法基礎知識。主要目的是幫助讀者回顧所學知識,順利完成后續(xù)的實驗與課程設計。
第2部分包含了22個實驗。這些實驗題目包括了主教材正文內容的不同實現(xiàn)方式(例如實現(xiàn)不帶頭節(jié)點形式的單鏈表),包括了對主教材內容的改進(例如對主教材的哈夫曼樹類模板的方法EnCode加以改進,將查找字符位置通過指向函數(shù)的指針來實現(xiàn)),包括了對主教材算法的優(yōu)化(例如用賦值語句代替交換兩個數(shù)據(jù)元素的方法,來優(yōu)化快速排序算法與堆排序),包括了對主教材算法的改造與提高(例如改進最小生成樹的Kruskal算法),還包括了數(shù)據(jù)結構與算法的有趣應用(例如要求在一個n×n的棋盤上放置n個皇后并且放置的n個皇后不會互相吃掉),通過實驗極大提高讀者數(shù)據(jù)結構與算法的應用能力。每個實驗都包括目的與要求、工具及準備工作、實驗分析、實驗步驟、測試與結論以及思考與感悟幾部分。實驗給出了具體操作步驟以及具體、實用的指導,讓初學者面對實驗題目不會束手無策。希望讀者通過實驗能夠學有所思,得到啟迪與感悟。
第3部分包含了11個課程設計項目。簡單的項目可以一個人單獨完成,復雜的項目可由幾個人共同完成。這些項目包括對主教材中實例研究的改進(例如從鍵盤上輸入中綴算術表達式,包括括號,計算出表達式的值),包括接近實際課題的項目(例如采用哈夫曼算法開發(fā)一個壓縮軟件,以及采用圖的知識開發(fā)公園導游系統(tǒng)),包括容易引起讀者興趣的項目(例如詞典變位詞檢索系統(tǒng)),還包括開拓學生視野的項目(例如用具有自學習功能的專家系統(tǒng)思想實現(xiàn)《動物游戲》的開發(fā))。課程設計項目一般都提供功能的擴展方法,基礎較差的讀者可只實現(xiàn)基礎功能,對數(shù)據(jù)結構與算法有興趣的讀者可實現(xiàn)更強的功能,這樣使不同層次的讀者都會有所收獲。讀者通過做這些項目能快速提高解決實際問題的能力。每個項目都給出了分析與實現(xiàn)方法,還給出了一些改進建議,讀者可以在完成基本任務的前提下,對程序加以改進和提高。
本書所有實驗與課程設計都在Visual C++ 6.0、Visual C++ 2017、DevC++ v5.11和CodeBlocks v16.01中通過測試。
為滿足不同層次的教學需求,本教材使用了分層的思想,分層方法如下: 沒加星號“”及“”的部分是基本內容,適合所有讀者學習;加有星號“”的部分是適合計算機專業(yè)的讀者深入學習的選學部分;加有兩個星號“”的部分適合感興趣的同學研究,尤其適合那些準備參加ACM競賽的讀者加以深入研究。作者為本書提供了全面的教學支持,讀者可在清華大學出版社官網(wǎng)的本書頁面下載如下教學資源。
(1) 本書作者開發(fā)軟件包(包含所有本書所講的數(shù)據(jù)結構與算法的類模板與函數(shù)模板)。
(2) 全書所有實驗與課程設計的在Visual C++ 6.0、Visual C++ 2017、DevC++ v5.11和CodeBlocks v16.01開發(fā)環(huán)境中的測試程序。
(3) 數(shù)據(jù)結構與算法相關的其他資料(例如DevC++v5.11與CodeBlocks v16.01軟件等開源C++編譯器)。
通過掃描二維碼可觀看全書所有實驗與課程設計的測試程序演示視頻,其中第1個二維碼對應Visual C++ 6.0開發(fā)環(huán)境的測試程序演示視頻,第2個二維碼對應VisualC++ 2017開發(fā)環(huán)境的測試程序演示視頻,第3個二維碼對應DevC++ v5.11開發(fā)環(huán)境的測試程序演示視頻,第4個二維碼對應CodeBlocks v16.01開發(fā)環(huán)境的測試程序演示視頻。
在附錄D中介紹Visual C++ 6.0、Visual C++ 2017、DevC++ v5.11和CodeBlocks v16.01開發(fā)環(huán)境建立工程的步驟,可通過掃描二維碼觀看具體操作視頻。
程艷紅、袁平、陳良銀、游倩、張銀、文芝明等人對本書做了大量的工作,包括提供資料,調試算法,參與了部分內容的編寫,在此特向他們表示感謝;作者還要感謝為本書提供直接或間接幫助的每一個朋友,由于你們的熱情幫助和鼓勵,才激發(fā)了作者寫好本書的信心和寫作熱情。
本書的出版要感謝清華大學出版社的相關編校人員大力支持,由于他們?yōu)楸緯某霭鎯A注了大量熱情,也由于他們的前瞻性眼光,才讓讀者有機會看到本書。
盡管作者有認真負責的態(tài)度,并做了最大努力,但由于作者水平有限,書中難免出現(xiàn)不妥之處,敬請各位讀者不吝賜教,以便及時修正,提高本書的水準。
作者2020年9月
目錄
第1部分基 礎 知 識
第1章緒論3
1.1數(shù)據(jù)結構的基本概念3
1.2算法和算法分析4第2章線性表6
2.1線性表的邏輯結構6
2.2線性表的順序存儲結構7
2.3線性表的鏈式存儲結構7第3章棧和隊列9
3.1棧9
3.2隊列10
3.3優(yōu)先隊列12第4章串13
4.1串類型的定義13
4.2字符串模式匹配算法13第5章數(shù)組和廣義表16
5.1數(shù)組16
5.2矩陣17
5.3廣義表19第6章樹和二叉樹22
6.1樹的基本概念22
6.2二叉樹23
6.3二叉樹遍歷25
6.4線索二叉樹26
6.5樹和森林的實現(xiàn)27
6.6哈夫曼樹與哈夫曼編碼32
6.7樹的計數(shù)33第7章圖35
7.1圖的定義和術語35
7.2圖的存儲表示38
7.3圖的遍歷40
7.4連通無向網(wǎng)的最小代價生成樹40
7.5有向無環(huán)圖及應用41
7.6最短路徑41第8章查找43
8.1查找的基本概念43
8.2靜態(tài)查找表43
8.3動態(tài)查找表43
8.4哈希表47第9章排序50
9.1概述50
9.2插入排序51
9.3交換排序51
9.4選擇排序51
9.5歸并排序52
9.6基數(shù)排序52
9.7外部排序53
第10章文件55
10.1主存儲器和輔助存儲器55
10.2各種常用文件結構55
第11章算法設計與分析56
11.1算法設計56
11.2算法分析58
第2部分實驗
實驗1石頭、剪刀、布61
實驗221點70
實驗3不帶頭節(jié)點形式的單鏈表80
實驗4任意大非負整數(shù)的任意大非負整數(shù)次方93
實驗5病人就醫(yī)管理102
實驗6利用后綴表達式計算中綴表達式的值107
實驗7文本串的加密115
實驗8改造串類120
實驗9螺旋方陣130
實驗10引用數(shù)使用空間表法廣義表存儲結構134
實驗11用二叉樹表示表達式147
實驗12改進哈夫曼樹類153
實驗13求最小生成樹的Kruskal的算法改進161
實驗14圖的根頂點166
實驗15鏈地址法處理沖突的哈希表170
實驗16字符統(tǒng)計177
實驗17改造快速排序算法181實驗18改造基數(shù)排序算法186
實驗19學生基本信息管理193
實驗20電話號碼的查找205
實驗21農夫過河問題216
實驗22n皇后問題225
第3部分課 程 設 計
項目1算術表達式求值233
項目2停車場管理系統(tǒng)237
項目3電話客戶服務模擬器244
項目4簡單文本編輯器250項目5壓縮軟件260
項目6排課軟件271
項目7公園導游系統(tǒng)282
項目8理論計算機科學家族譜的文檔/視圖模式288
項目9動物游戲296
項目10簡單個人圖書管理系統(tǒng)302
項目11詞典變位詞檢索系統(tǒng)311
參考文獻316
附錄A本書配套軟件包318
附錄B實驗報告格式324
附錄C課程設計報告格式325
附錄D流行C++開發(fā)環(huán)境的使用方法326