本書全面介紹了數據結構的基礎內容,幫助學生深入了解軟件工程的思想和技術。學生還可以通過對一些高級編程概念(如接口、抽象和封裝)的了解,為進一步深入學習高級編程知識打下堅實的基礎。本書觀點清晰明了、語言風格鮮明獨特,深入淺出地介紹了一些高級主題。本書特色:◆介紹了多個庫包,可用于簡化編程流程,使學生可以專注于高層次理論問題的研究,避免了C語言編程的繁瑣細節(jié);◆詳細討論了遞歸編程的用法,包括大量難度各異的編程示例和練習,如簡單的遞歸函數,分析雙人游戲的最小最大(minimax)策略,等等;◆幫助讀者培養(yǎng)編寫健壯、可重用代碼的良好編程習慣。本書前言寫給教師本教程適用于大學編程課程,它覆蓋了AMCCurriculum78報告中所定義的計算機科學2標準課程的材料,并且包括ComputingCurriculum1991算法與數據結構課程中的大部分知識。本書將教會學生現(xiàn)代軟件工程方法論。本書的內容建立在我于1995年寫的TheArtandScienceofC教科書的基礎上,并將抽象和接口設計作為核心主題。雖然我寫作這兩本書是有先后順序的,但是讀者完全可以單獨使用本書。本書的第Ⅰ部分包括了TheArtandScienceofC中學生應該掌握的所有背景知識。這些背景知識對于理解本課程其他部分中的例子和方法已經綽綽有余了。由于第Ⅰ部分的介紹是比較簡單,因此學生必須熟悉計算機基礎課程中涉及的基本編程概念。但是,讀者不需要對C語言有所了解,因為在本書的前幾章中將介紹C語言的基礎。學習過TheArtandScienaofC課程的學生完全可以跳過第Ⅰ部分的內容。在學習完了第Ⅰ部分的預備知識之后,學生可以繼續(xù)該課程的學習。第Ⅱ部分將討論遞歸算法。在第Ⅱ部分的4章內容中,穿插了大量的實例。根據我個人的經驗,介紹遞歸算法的最合理時刻是在第Ⅱ門編程課程開始學習的時候。很多學生都會覺得遞歸是一個難以理解的概念,必須花很多時間才能較好地掌握它。如果在新學期的一開始就面臨遞歸這個難點,那么學生將有更多的時間來掌握它。在本書中,盡可能早地介紹遞歸概念,其目的是讓讀者在作業(yè)和考試中運用這種知識。期中考試可以檢查學生對遞歸概念的掌握情況,對于那些確確實實理解遞歸概念比較差的學生,可以給他們以警示,以便他們及時采取相應的補救措施。如果想壓縮學習遞歸的時間,那么可以跳過第Ⅱ部分的6.1節(jié),這對整個課程的講述沒有什么影響。也許鞍點算法對于部分學生來說有點兒太復雜了,但是它卻很好地說明遞歸算法可以使用很少的代碼來解決非常困難的問題。類似地,第7章中大O的理論基礎也不是該課程的重點內容。第Ⅲ部分有雙重目的:一方面,它介紹了數據結構課程中涉及的非遞歸算法的概念,包括堆棧、隊列以及符號表;另一方面,這部分為學生提供了一些工具,從而幫助學生理解其他部分中涉及的基于接口編程的數據抽象概念。與這個概念相一致的是抽象數據類型(ADT),它是由行為而不是由表現(xiàn)形式定義。本書的一個重要特點是,它不完全使用ANSIC的工具來定義ADT,其中ADT的內部表示對于客戶端來說是不可訪問的。由于這樣的編程風格強調了抽象的難度,因此可以培養(yǎng)學生具有編寫良好結構的程序和模塊的習慣。我認為在本書中學習的接口是個實用的工具。在許多情況下,學生可以在他們自己的代碼中包含和實現(xiàn)這些接口。在第Ⅲ部分的最后一章,即第11章,將介紹幾個重要的概念,例如,函數指針、映射函數以及迭代器。相對來說,迭代器在斯坦福大學的課程中是新近加入的,但是教學效果相當好。根據我們的經驗,減少客戶代碼的復雜性所帶來的收益遠遠超過建立迭代器抽象所做工作的代價。第Ⅲ和第Ⅳ部分的重點是抽象數據類型。在某種程度上,這是人為劃分的結果。這兩部分的不同之處在于,第Ⅳ部分中的抽象數據類型是用遞歸實現(xiàn)的,而第Ⅲ部分則不是。這樣安排的好處是第Ⅳ部分在本書中起到綜合的作用,將前兩部分的遞歸和ADT進行綜合。盡管第14章中關于表達式樹的內容可以跳過,但是我發(fā)現(xiàn)盡早地在課程中包括這些內容是很有價值的,因為這樣可以減少對C語言編譯器操作的神秘感,可以幫助學生更好地理解和控制程序。第17章確實不是本課程的主要內容,而是為學生繼續(xù)接下來的學習作的預備。本章主要使用Java語言介紹面向對象編程,講述主要的概念。盡管有些機構已經開始采用由淺入深的順序方式介紹Java,但是我們認為,由于下列一些原因,先介紹結構化編程方法再介紹面向對象編程方法是很有意義的:1.Java環(huán)境的變化太快了,無法為教學提供穩(wěn)固的基礎;2.學生有必要理解結構化編程方法;3.如果在基礎課程中強調數據抽象和接口,那么學生學習面向對象編程將更加容易。在斯坦福大學的經驗給我們的啟示是,這種策略很有效,它能夠使學生相對容易地接受面向對象的概念。