java項目——數據結構總結報告java
20135315 宋宸寧算法
實驗要求編程
一、用java語言實現數據結構中的線性表、哈希表、樹、圖、隊列、堆棧、排序查找算法的類。數組
二、設計集合框架,使用泛型實現各種。數據結構
三、API的編寫,並導出。app
四、使用TDD模式,對程序進行測試,利用TestSuite將各測試類整合到一塊兒。框架
五、與小組成員實現代碼的整合。函數
實驗設計過程post
實驗內容學習
一、線性表的編寫
首先根據線性表的性質,進行功能的抽取,設計list接口,讓順序表類和鏈表類分別實現它的功能,具體包括isEmpty()是否爲空函數,insert()插入函數,append()尾插函數,search()查找函數,remove()刪除函數,get()獲取元素函數,set()重置函數,length()長度函數等。
而後依次在順序表中實現以上函數,在實現接口的同時,增長特殊性的函數,如構造函數等。
在鏈表中實現以上類,注意,在鏈表類的設計中,要先設計出鏈表節點類,以便在鏈表的構造函數中調用。鏈表節點類中並無具體方法,只有3種不一樣的構造函數方法。
二、隊列堆棧的編寫
首先根據隊列的性質,進行功能的抽取,設計queue接口,具體包括isEmpty()是否爲空函數,enqueue()入隊函數,dequeue()出隊函數等。
而後依次用數組類型實現順序隊列,用鏈表類型實現鏈表隊列。
首先根據堆棧的性質,進行功能的抽取,設計stack接口,具體包括isEmpty()是否爲空函數,push()入棧函數,pop()出棧函數,get()獲取函數等。
而後依次用數組類型實現順序堆棧,用鏈表類型實現鏈表堆棧。
三、圖的編寫
首先根據圖的性質,進行功能抽取,設計Graph接口,具體包括靜態常量最大權重值99999,vertexCount()計算頂點數函數,get()獲取頂點元素函數,getWeight()獲取邊的權值函數,insertVertex()插入頂點元素函數,insertEdge()插入邊函數,removeVertex()移除頂點函數,removeEdge()移除邊函數,getNextNeighbor()獲取鄰接點函數,DFSTraverse()深度遍歷函數,BFSTraverse()廣度遍歷函數。
定義邊類實現Comparable接口,編寫構造方法,初始化起始頂點號,結束頂點號和權值;複寫toString()函數,用於打印輸出邊的參數;實現compareTo()函數,進行起始頂點值的比較。
編寫抽象圖類實現Graph接口,複寫DFSTraverse()深度遍歷函數,BFSTraverse()廣度遍歷函數,增長minSpanTree_prim()生成最小生成樹函數,Dijkstra算法求帶權圖中頂點vi的單源最短路徑函數shortestPath(),Floyd算法求帶權圖每對頂點間的最短路徑函數shortestPath()。
最後,編寫鄰接矩陣圖類繼承抽象圖類,編寫構造函數,初始化圖的數據,分別複寫抽象圖類中的功能。
四、樹的編寫
首先根據樹的性質,進行功能的抽取,設計BinTree接口,具體包括isEmpty()判斷數是否爲空函數,count()計算二叉樹節點數函數,height()計算二叉樹高度函數,preOrder()先序遍歷函數,inOrder()中序遍歷函數,postOrder()後序遍歷函數,levelOrder()層序遍歷函數,search()查找函數,getParent()獲取父母節點函數,insertRoot()插入根節點函數,insertChild()插入子節點函數,removeChild()刪除子節點函數,removeAll()刪除所有元素函數。
編寫節點類,設計三種構造方法,分別爲傳入空參數,傳入節點數據域的數值,傳入節點數據域的數值和左右子樹。
編寫二叉樹類實現BinTree接口,實現BinTree接口中的方法,增長如下方法:create()建立新節點函數,getParent()在從某一節點開始的二叉樹中獲取父母節點函數,preOrder()從某一節起先序遍歷函數,inOrder()從某一節點起中序遍歷函數,postOrder()從某一節點起後序遍歷函數,levelOrder()從某一節點起層序遍歷函數,serach()從某一節點起插入節點函數,count()從某一節點起計算二叉樹節點數函數,height()從某一節點起計算二叉樹高度函數。
編寫二叉排序類繼承二叉樹類,增長insert()插入元素方法,remove()刪除元素方法,remove()刪除節點方法。
五、哈希表的編寫
編寫哈希表類。包括兩種構造方法,空參數法和傳入表容量值法,以及hash()求元素散列地址函數,insert()插入方法,remove()移除方法,search()查找方法,toString()輸出散列表信息函數。
六、API的編寫
在每個類前加一個文檔註釋,聲明該類的用途,包含的方法,以及做者和版本信息。注意,幫助文檔的編寫要隨着代碼的編寫而進行,這樣會減小沒必要要的麻煩。當寫完全部的幫助文檔後,經過flie->export->選擇java文件夾下的javadoc->選擇要生成幫助文檔的工程,選擇生成地址->點擊finish便可。
七、TDD的編寫
因爲要測試的類中的方法具備關聯性,因此我經過設計不一樣的情景,同時對多個函數進行測試,而不是依次測試各個函數。其次,要測試的類中用到了泛型方法,因此分別設計了Integer類型的測試和String類型的測試。最終使用TestSuite功能,將全部類對應的測試類,整合到一個Test測試類中,對測試類進行統一管理和測試。
八、GUI界面的編寫
經過自學圖形用戶界面部分,將各類數據結構類的各類方法經過圖形用戶界面實現出來。將各類功能的實現經過按鈕來實現,其中比較重要的是,界面的設計。個人設計是,經過一個文本欄輸出要操做的數據,將不一樣的方法對應上相應的按鈕,經過操做按鈕實現相應的功能。設置一個文本框,將操做的結果輸出。因爲時間有限,因此設計的比較粗糙。
實驗結果與測試
一、完成DataStructure工程下,BinSortTreeStructure包、HashTableStructure包、linkedstructure包、MapStructure包、queuestructures包、Sort包以及stackstructures包的編寫,分別包含二叉排序數類、散列表類、線性表類、圖類、隊列類、排序類以及堆棧類,注意關於查找的方法,沒有統一封裝起來,而是分別分裝在美中數據結構的具體類包裏,由於查找方法做爲一種基本操做,已經包括在基礎類中,沒必要在進行封裝。
二、完成整個工程的TDD測試。
(1)TDD測試結果是比較全面的,具體到每個類中的每個方法。注意並不包含私有方法,由於我編寫的程序中,私有方法是爲了公有方法服務的,在公有方法的實現過程當中調用了私有方法,若是TDD測試能夠經過,也就間接說明了相應的私有方法的正確性。
(2)此外,在編寫TDD測試的過程當中,我設計每一種數據結構的情景,並非類中的方法分離開測試的,而是一個方法的測試接着另外一個方法,由於方法與方法之間是有聯繫的。(3)值得特別一提的是,在編寫產品代碼的時候,我使用了泛型這一新的結構,並在測試的過程當中,分別針對整形Integer對象和字符串型String對象使用了泛型,都測試出告終果。
三、將各類數據結構類用GUI界面實現。經過自學圖形用戶界面的相關知識,在編程以前,首先要設計出所需的界面,實現一個框架中,包括各類功能函數的按鈕,輸入數據的文本框以及顯示結果的文本框。
四、API的編寫。因爲學習java視頻,我養成了邊寫代碼邊寫註釋的習慣,在代碼寫完後,相應的註釋也寫好了,因此直接在文件選項卡下,選擇導出就能夠了。
五、最終將全部代碼和API文檔打包成jar包,以備隊友使用。
實驗總結
一、TDD的編寫必定要隨着代碼一塊兒進行。在本次實驗中,我是完成了所有的代碼編寫工做後,纔開始寫TDD的,在測試過程當中,經常由於一個問題一直不成功,浪費不少時間回頭找緣由,並且加上編完代碼也過去了一段時間,不少代碼部分也有些遺忘,又不得不從頭開始改起,耽誤了大量的時間,記得有一個建立二叉排序數的函數的編寫中,因爲一個地方把大於當作小於,致使程序一直有問題,在我讀了不少遍代碼後,才最終發現問題。邊寫程序邊測試,這一點是我在此次實驗中最大的收穫。
二、在設計類的時候,必定要學會提取和抽象,能總結成接口和抽象函數的功能,就要總結,剛開始的時候,我編寫線性表時,當時只顧閉門造車,一個勁的生遍,致使鏈表和順序表類的不少功能都有類似之處,但都沒有抽取出來,致使一個類中有過多的冗雜的函數,閱讀起來不方便,查找也不方便,經過閱讀參考書,我在學習他人的代碼過程當中,學習瞭如何提取功能,創建接口和抽象類,以及父類。
三、特別的一點是,在對Sort排序類進行TDD測試的時候,因爲忽略了字符串這一類型的特色,排序java十、java0六、java006時,因爲個人主觀臆斷,認爲結果應該爲java0六、java00六、java10,致使測試成功,後來發現字符串類型數據和整形數據的區別後,修改了預期結果,才使測試得以經過。不過,大多數狀況下,測試不經過仍是因爲程序的緣由,好比在建立二叉排序數的過程當中,對建好的二叉排序樹進行中序排序,輸出的結果老是有一部分錯誤,有時又能正常經過,後來發如今一個if判斷語句中,大於小於寫反了。經過TDD測試確實能發現問題,使程序更準確、完整。
四、API的編寫在編程的過程當中也顯得尤其重要。只有邊編程邊寫註釋,才能減小往後的麻煩,許多程序隔了一段時間後再看,會發現讀不懂了,這時就體現了註釋的重要意義。此外,養成良好的編程習慣,咱們就會逐步成長爲一名合格的編程人員。API的編寫,不可是對編程者的提示,更要有提示用戶的左右,因此寫註釋的時候,必定要註明函數的功能,參數的意義和返回值的意義。更要注意文檔註釋的編寫,文檔註釋是對整個類的解釋,因此要說明該類的用途和功能,以及做者和版本信息。
五、經過去圖書館借閱相關的書籍,我經過只看一部分的內容,如關於鏈表部分的,經過比較,最終篩選出最適合書,並以該書做爲參考,實現了往後的編程。這使我查閱資料的能力獲得了提升。在本次實驗中,我認爲我最大的收穫是學會了如何自學和如何查資料,經過借閱不一樣的相關書籍進行比較,能夠很清晰的發現各類書的差別,也能夠找到最合適本身水平的書來閱讀學習。
六、在本次實驗中除了項目代碼的完成,我也學會一些東西。好比,開發一個項目TDD測試必定要緊跟着代碼的編寫完成,只有這樣才能保證你的代碼可使用各類不一樣的狀況,以及在編寫的過程當中,及時的跟進註釋的編寫。如何查資料。如何快速學習。在本次的實驗中,我發現有目的的學習,比盲目的學習課本要有效率的多,並且還能夠保證你真正的學到了知識,這一點適合任何學科、任何事物的學習。