20176408李俊 栈和队列
棧:限定僅在表尾進行插入和刪除操作的線性表。
空棧:不含任何數據元素的棧。
允許插入和刪除的一端稱為棧頂,另一端稱為棧底。
棧的操作特性:后進先出(LIFO)
注意:棧只是對表插入和刪除操作的位置進行了限制,并沒有限定插入和刪除操作進行的時間。
棧中元素具有相同類型及后進先出特性,相鄰元素具有前驅和后繼關系。
兩棧共享空間
在一個程序中需要同時使用具有相同數據類型的兩個棧,如何順序存儲這兩個棧?
直接解決:為每個棧開辟一個數組空間。
順序棧單向延伸——使用一個數組來存儲兩個棧。
兩棧共享空間:使用一個數組來存儲兩個棧,讓一個棧的棧底為該數組的始端,另一個棧的棧底為該數組的末端,兩個棧從各自的端點向中間延伸。
順序棧和鏈棧的比較
時間性能:相同,都是常數時間O(1)。
空間性能:
順序棧:有元素個數的限制和空間浪費的問題。
鏈棧:沒有棧滿的問題,只有當內存沒有可用空間時才會出現棧滿,但是每個元素都需要一個指針域,從而產生了結構性開銷。
總之,當棧的使用過程中元素個數變化較大時,用鏈棧是適宜的,反之,應該采用順序棧。
遞歸的定義
子程序(或函數)直接調用自己或通過一系列調用語句間接調用自己,是一種描述問題和解決問題的基本方法。
遞歸的基本思想
問題分解:把一個不能或不好解決的大問題轉化為一個或幾個小問題,再把這些小問題進一步分解成更小的小問題,直至每個小問題都可以直接解決。
遞歸的要素
遞歸邊界條件:確定遞歸到何時終止,也稱為遞歸出口;
遞歸模式:大問題是如何分解為小問題的,也稱為遞歸體。
遞歸過程與遞歸工作棧
遞歸過程在實現時,需要自己調用自己。
層層向下遞歸,返回次序正好相反。
遞歸函數的內部執行過程
⑴ 運行開始時,首先為遞歸調用建立一個工作棧,其結構包括值參、局部變量和返回地址;
⑵ 每次執行遞歸調用之前,把遞歸函數的值參和局部變量的當前值以及調用后的返回地址壓棧;
⑶ 每次遞歸調用結束后,將棧頂元素出棧,使相應的值參和局部變量恢復為調用前的值,然后轉向返回地址指定的位置繼續執行。
隊列的邏輯結構
隊列:只允許在一端進行插入操作,而另一端進行刪除操作的線性表。
空隊列:不含任何數據元素的隊列。
允許插入(也稱入隊、進隊)的一端稱為隊尾,允許刪除(也稱出隊)的一端稱為隊頭。
隊列中元素具有相同類型及先進先出特性,相鄰元素具有前驅和后繼關系!
放寬隊列的所有元素必須存儲在數組的前n個單元這一條件 ,只要求隊列的元素存儲在數組中連續的位置。
設置隊頭、隊尾兩個指針!
假溢出:當元素被插入到數組中下標最大的位置上之后,隊列的空間就用盡了,盡管此時數組的低端還有空閑空間,這種現象叫做假溢出。
循環隊列:將存儲隊列的數組頭尾相接。
隊列的順序存儲結構及實現
1.附設一個存儲隊列中元素個數的變量num,當num=0時隊空,當num=QueueSize時為隊滿;
2.修改隊滿條件,浪費一個元素空間,隊滿時數組中只有一個空閑單元;
3.設置標志flag,當front=rear且flag=0時為隊空,當front=rear且flag=1時為隊滿。
時間性能:循環隊列和鏈隊列的基本操作都需要常數時間O (1)。
空間性能:
循環隊列:必須預先確定一個固定的長度,所以有存儲元素個數的限制和空間浪費的問題。
鏈隊列:沒有隊列滿的問題,只有當內存沒有可用空間時才會出現隊列滿,但是每個元素都需要一個指針域,從而產生了結構性開銷。
總結
以上是生活随笔為你收集整理的20176408李俊 栈和队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 更新文件服务器,文件更新服务器
- 下一篇: java导出html word文档_ja