資料結構與演算法(七) 棧和佇列

2021-08-19 23:35:34 字數 2045 閱讀 7385

這是第七天,每天的開始都問自己昨天做了什麼,今天要做什麼的一種心情

1、棧(資料結構):filo,後進先出

2、佇列:lilo,先進先出

這裡順便複習以下《組合語言(王爽)》中的函式呼叫棧

①esp:棧指標暫存器,其記憶體中存放的是乙個指標,永遠指向系統棧最上面的乙個棧幀的頂部。push和pop指令會改變esp的值

②ebp:基址指標暫存器,其內存放著乙個指標,永遠指向系統棧最上面的乙個棧幀的底部。

③eip:指令暫存器,其內存放著乙個指標,永遠指向下一跳待執行的指令的位址。cpu根據eip所致的位置取出指令和運算元後,送入算數邏輯單元出運算。

①引數入棧:將引數從右向左一次壓入系統棧中

②返回位址入棧:將當前**區呼叫指令的下一跳命令位址壓入棧,讓函式返回時能夠繼續執行

③**區跳**處理器從當前**區跳轉到被呼叫函式的入口處

④棧幀調換:儲存當前棧幀狀態值,以備後面恢復本棧幀時使用,此時ebp入棧==>將當前棧幀切換到新棧幀(將esp值裝入ebp,更新棧幀底部)==>給新棧幀分配空間(把esp減去所需空間的大小,抬高棧頂)

【主要還是看上面的分析】自己分析起來也是半吊子都不到,但是很重要的一點是要記住每次呼叫函式都要

push ebp;

mov ebp,esp

sub esp,[需要的空間大小]

…………

mov esp,ebp

pop ebp

ret【回到呼叫出,pop eip,之後跳轉】

//模板類

template

class cqueue

;

1、乙個佇列包含了兩個棧stack1和stack2,所以這道題的意思是要求我們操作兩個「先進後出」的棧實現乙個「先進先出」的佇列

2、直接看圖:用兩個棧模擬乙個佇列的操作

當stack2不為空時,在stack2中的棧頂的元素是最先進入佇列的元素,可以pop。當stack2為空時,我們把stack1中的元素逐個pop之後push進入stack2.由於先進入佇列的元素被壓倒stack1的底端,經過彈出和壓入操作之後就處於stack2的頂端,又可以彈出。

template

template

t deletehead()

}//上面將數從1搬到2之後,2還是為空,說明1中沒有數,兩個stack都是空的

資料結構與演算法 棧和佇列

棧 是限制在表的一端進行插入和刪除運算的線性表。棧又稱後進先出簡稱lifo表 佇列 也是一種運算受限的線性表。它只允許在標的一端進行插入,而在另一端進行刪除。佇列亦稱先進先出fifo表 1.棧與佇列的區別 1 佇列先進先出,棧先進後出。2 對插入和刪除操作的 限定 棧是限定只能在表的一端進行插入和刪...

資料結構與演算法 棧和佇列

棧 stack 有些地方稱為堆疊,是一種容器,可存入資料元素 訪問元素 刪除元素,它的特點在於只能允許在容器的一端 稱為棧頂端指標,英語 top 進行加入資料 英語 push 和輸出資料 英語 pop 的運算。沒有了位置概念,保證任何時候可以訪問 刪除的元素都是此前最後存入的那個元素,確定了一種預設...

佇列 棧(資料結構與演算法)

佇列是一種先進先出 fifo 的資料結構,從隊尾進,從隊頭出 在 fifo 資料結構中,將首先處理新增到佇列中的第乙個元素。如上圖所示,佇列是典型的 fifo 資料結構。插入 insert 操作也稱作入隊 enqueue 新元素始終被新增在佇列的末尾。刪除 delete 操作也被稱為出隊 deque...