1. 程式人生 > >數據結構第三章學習小結

數據結構第三章學習小結

不同的 結果 方法 == 網上 優點 感受 lin 運行

一、內容小結:

第三章學習了棧和隊列的有關知識,不僅學習了兩種結構的定義、表示方法,並且在實現的過程中,也感受到了結構的應用的不同之處。開始形成了一種學習數據結構的步驟思維,也就是在新定義一種數據數據結構時,我們首先要考慮的是ADT,基於ADT的基本操作,進一步考慮每種操作如何實現,再根據實際問題考慮該結構需要使用的存儲結構。

1.棧:

棧是後進先出的線性表,基於這個特點,我們在需要按照保存數據時相反的順序來使用數據時,用棧來實現會十分方便。

除了初始化之外,入棧和出棧是棧的重要操作,順序棧在實現入棧操作時,需要判斷棧滿,在實現出棧操作時則需要判斷棧空,棧滿和棧空都可以用定義的棧底指針及棧頂指針表示。鏈棧需要註意的是初始化時,棧頂指針要置空,否則為野指針,無法申請內存區域,亂指一氣,這是應該養成的習慣。

關於棧還學習了用棧實現遞歸的一個應用,使用遞歸的優點是結構清晰易讀,缺點是時間開銷大,容易重復子問題,可能會增加時間復雜度。

2.隊列:

隊列是先進先出的線性表,基礎操作也包括初始化、入隊、出隊。

順序隊列會出現“假溢出”的問題,隊列所用的存儲區沒有滿,但隊列卻發生了溢出,對於這種情況,我們可以定義循環隊列,通過取余將頭尾連接,於是我們可以用:(Q.rear+1)MAX==Q.front判斷隊滿,非常巧妙。

鏈隊一般也要定義頭結點,定義頭結點可以保證處理不同個數數據時的操作都一致,入隊在隊尾操作,出隊在隊頭操作。

二、 作業總結

1.括號匹配:

括號匹配是非常適合用棧實現的一個例子,一開始理解題目意思後沒有認真整理思路,導致被不同的方法左右,再加上編寫代碼的能力不夠,花費了大量時間模仿一個我其實並不理解的思路。之後在老師同學的幫助下才真正理解了如何用棧實現這個問題。

首先可以定義字符串數組,並用cin.getline函數逐個讀入數組,這樣通過判斷是否為讀入的符號是否為\0就可以判斷是否換行。當讀到左括號時入棧,讀到右括號時將棧內的符號出棧,就可判斷是否與右括號匹配。最後通過判斷在代碼中標記的flag的值來判斷匹配結果。

2.銀行業務隊列

做這道題時先畫了一個流程,有了大體思路後再寫代碼就輕松許多,雖然中間有很多步驟出錯,但是參考資料後都解決了。該程序的數據就像排隊,先排的人先走,因此很容易能想到用隊列實現,題目中奇數與偶數需要被分到不同的位置,因此需要定義兩個隊列,將奇數和偶數分別按順序分配到兩個隊列,再以輸出兩個奇數一個偶數的順序實現程序。

編寫數字輸出順序這部分代碼時,因為輸出的首數字和末數字是不加空格的,於是想到了循環語句中輸出的第一個數字應該直接輸出,不加空格,但這導致了進行下一次循環時第一個數字依舊沒有空格,和之前輸出的第三個數字無法分隔,於是插入了一個flag,在運行完第一次循環的同時改變flag的值,並添加不是第一次循環時程序如何執行的代碼。

在做題時還是思路模糊,不清楚如何實現,總是一邊寫一邊考慮下一部分應該做什麽,所以之後做題時應該在紙上寫下大致的流程,明確每一步要做什麽以後再具體實現每一個步驟,具體步驟不懂的話再參考網上的代碼或者同學的意見,同時還是要增強編程能力,做題之前好好讀題很重要,不能心急隨便瀏覽題目,發現自己不會後就求助,先給自己獨立思考的空間,希望下一次編寫代碼時能高效一些,避免浪費時間,找到對的方法做題。

數據結構第三章學習小結