四.棧和隊列

棧(stack):限定僅在線性表表尾進行插入和刪除操作的線性表
允許插入和刪除的一端稱爲棧頂;另一端稱爲棧尾,後進先出,簡稱LIFO結構

棧的插入操作叫做進棧,也稱圧棧,入棧
棧的刪除操作叫做出棧,也有的叫做彈棧
兩棧共享空間是在數組的兩端,讓他們向中間靠攏 兩指針相差1爲棧滿
對於棧來說,如果是兩個相同數據類型的棧,則可以通過數組的兩端作爲棧底的方法讓兩個棧共享數據,這樣就可以最大化的利用數組的空間.

鏈棧是不需要頭結點的.

順序棧需要事先確定一個固定的長度,存在內存空間問題浪費問題,優勢是存取時定位很方便
鏈棧是要求每一個元素都有指針域,增加一些內存開銷,優勢是對於棧的長度無限制

棧的應用:遞歸--------裴波那契數列實現
int Fbi(int i)
{
If(i<2)
return i==0?0:1;
return Fbi(i-1)+Fbi(i-2);//這裏的Fbi就是函數自己,它在調用自己*
}

遞歸:直接調用自己或通過一系列的調用語句間接的調用自己的函數,稱作遞歸函數
每個遞歸定義必須至少有一個條件,滿足時遞歸不再進行,即不再引用自身而是返回值退出

棧的應用:四則運算表達式求職
逆波蘭表示:一種不需要括號的後綴表達法稱爲逆波蘭表示(RPN)

隊列(Queue):允許在一端進行插入操作,而在另一端進行刪除操作的線性表

允許插入的一端叫做隊尾,允許刪除的一端稱爲隊頭

循環隊列:把這種頭尾相接的順序存儲結構稱爲循環隊列
優點:解決移動數據的時間損耗,時間複雜度O(n)變成O(1)

循環隊列和鏈隊列差異?
時間上,基本操作都是O(1);不過循環隊列是事先申請好空間,使用期間不釋放,對於鏈隊列,每次申請和釋放結點也會存在一些時間開銷
空間上,循環隊列必須有一個固定的長度,所以就有了存儲元素個數和空間浪費的問題,而鏈隊列不存在這個問題,儘管他需要一個指針域,產生空間上的開銷

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章