棧與佇列
棧、佇列都是特殊的線性表(受限表),只不過對插入和刪除操作做了限制(沒有修改操作),這些操作只能限制在表的一端
what棧:棧是限定僅在表尾(這裡的表尾是指棧頂,而不是棧底)進行插入和刪除操作的線性表
what佇列:佇列是只允許在表的一端進行插入操作,而在表的另一端進行刪除操作的線性表
棧、佇列和線性表一樣,分順序實現和鏈式實現
棧
棧的順序實現adt
typedef
intelemtype;
class
stack
inline
bool
empty()
const;
inline
int
size()
const
;
bool
top(elemtype &item)
const
;bool
push(
const
elemtype &item);
bool
pop();
private
:static
const
intkmaxstack=3;
inttop_;
elemtype entry_[kmaxstack];};
棧的鏈式實現adt
typedef
intelemtype;
class
node
};
class
linkstack
~linkstack();
inline
bool
empty()
const;
inline
intsize()
const;
bool
top(elemtype &entry)
const;
void
push(
const
elemtype &entry);
bool
pop(); };
我們把允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom),不含任何資料元素的棧稱為空棧。棧又稱為後進先出(last in first out)的線性表,簡稱lifo結構。
棧的注意細節:
2)它的特殊之處在於限制了這個線性表的插入和刪除位置,它始終只在棧頂進行。這也就使得:棧底是固定的,最先進棧的只能在棧底。
順序實現:
核心思想: 下標為0的一端作為棧底,當棧存在乙個元素時,top=0,而空棧時top=-1
鏈式實現:
核心思想: 由於棧只是用棧頂來做插入和刪除操作,所以單鏈表的棧頂指標也作為頭指標,兩者合二為一,就不需要頭指標了
棧的順序實現和棧的鏈式實現優劣比較:
時間效能:
兩者時間複雜度一樣,均為o(1),無論是讀取、插入還是刪除。但鏈式實現在插入、刪除時還需要分別申請節點和釋放節點,若棧需要頻繁插入或刪除,兩者還是有些細微差異。
空間:
順序實現需要預分配,所以可能會存在空間浪費的問題;鏈式實現每個節點還需儲存指標域,會增加一些記憶體開銷,但對棧的長度無限制
佇列 佇列
的
順序實現adt
what迴圈佇列:我們把佇列的這種頭尾相接的順序儲存結構稱為迴圈佇列
迴圈佇列時間效能為o(1),避免了普通佇列順序實現只有乙個top指標,出列時要移動資料元素,使得時間複雜度為o(n)
迴圈佇列核心思想:佇列滿時,為只有乙個元素空間時。即插入時,預留乙個元素空間
如不留空間,如front==rear,則無法判斷佇列是處在滿還是空的狀態
實現技巧:
佇列滿的條件是(rear+1)%queuesize==front
佇列長度:(rear-front+queuesize)%queuesize (rear>front時,長度=rear-front;rear
《大話資料結構》第4章 棧與佇列
我們把乙個直接呼叫自己或通過一系列的呼叫語句間接地呼叫自己的函式,稱做遞迴函式 版本1 迭代版本 func fbi1 i int int return arr i 版本2 遞迴版本 func fbi2 i int int 迭代使用的是迴圈結構,遞迴使用的是選擇結構遞迴使程式的結構更清晰 更簡潔 更容...
大話資料結構4之棧與佇列
1.棧是限定僅在表尾進行插入和刪除操作的線性表。佇列是只允許在一端進行插入操作 而在另一端進行刪除操作的線性表。2.我們把允許插入和刪除的一端稱為棧頂 top 另一端稱為棧底 bottom 不含任何資料元素的棧稱為空棧。棧又稱為後進先出的線性表,簡稱lifo結構。棧的插入操作,叫做進棧,也稱壓棧 入...
大話資料結構 棧與佇列
文章知識點來至於大話資料結構裡邊章節知識,這篇主要介紹棧與佇列在計算機中儲存形式,以及在某些演算法領域中對棧和佇列的相關應用。章節最後介紹了著名的逆波蘭表示式,以及通過演算法來實現該表示式的運算過程。在實現 的同時新增了流程圖。相關 原始碼請檢視文章最後。1 棧結構定義 2 棧的順序儲存 3 兩棧共...