漫畫演算法 學習筆記(23)

2021-10-22 04:03:32 字數 2418 閱讀 1619

q: 用兩個棧來模擬乙個佇列,要求實現佇列的兩個基本操作,入隊和出隊。

思路

棧的特點是先入後出(filo),出入元素都是在同一端(棧頂)。

佇列的特點是先入先出(fifo),出入元素是在不同的兩端(隊頭和隊尾)。

由於我們可以使用兩個棧,那麼可以讓其中乙個棧作為佇列的入口,負責插入新元素;另乙個棧作為佇列的出口,負責移除老元素。

佇列的主要操作無非有兩個:入佇列、出佇列。

在模擬入佇列操作時:每乙個元素都被壓入到棧a中。

讓元素1入佇列。

讓元素2入佇列。

讓元素3入佇列。

這時,我們希望最先入隊的元素1出佇列,需要怎麼做呢?

讓棧a中的所有元素按順序出棧,再按照出棧順序壓入棧b。這樣以來,元素從棧a彈出並壓入棧b的順序是3,2,1;和當初進入棧a的順序1,2,3,是相反的。

此時讓元素1出佇列,也就是讓元素1從棧b中彈出。

讓元素2出佇列。

如果此時,又想做入佇列操作呢?當有新元素入隊時,重新把新元素壓入棧a中。

讓元素4入隊。

此時出隊操作仍然從棧b中彈出元素。

讓元素3出隊。

此時棧b已經空了,如果再想出佇列該怎麼辦呢?也不難,只要棧a中還有元素,就像剛才一樣,把棧a中的元素彈出並壓入棧b即可。

讓元素4出佇列。

時間複雜度

入隊操作的時間複雜度顯然是o(1)。至於出隊操作,如果涉及棧a和棧b的元素遷移,那麼一次出隊的時間複雜度是o(n);如果不用遷移,時間複雜度是o(1)。

**實現

private stack

stacka=

newstack

();private stack

stackb=

newstack

();/**

* 入隊操作

* param element 入隊的元素

*/public

void

enqueue

(int element)

/*** 出隊操作

*/public integer dequeue()

transfer()

;}return stackb.

pop();

}/**

* 棧a元素轉移到棧b

*/private

void

transfer()

}public

static

void

main

(string[

] args)

throws exception

golang實現
type myqueue struct

func

newqueue()

*myqueue

}// 將元素插入到隊尾

func

(q *myqueue)

enqueue

(x int

)// 將元素出佇列

func

(q *myqueue)

dequeue()

int val := q.outstack[

len(q.outstack)-1

]// outstack 出棧

q.outstack = q.outstack[

:len

(q.outstack)-1

]return val

}func

(q *myqueue)

instacktooutstack()

}// 返回當前隊頭頭部元素

func

(q *myqueue)

peek()

intreturn q.outstack[

len(q.outstack)-1

]}func

(q *myqueue)

isempty()

bool

func

(q *myqueue)

isoutstackempty()

bool

func

(q *myqueue)

isinstackempty()

bool

func

main()

總結

本題思路其實還是比較清晰的。

將乙個棧當作輸入棧instack,用於壓入enqueue傳入的資料;另乙個棧outstack當作輸出棧,用於dequeuepeek操作。每次dequeuepeek時,若輸出棧為空則將輸入棧的全部資料依次彈出並壓入輸出棧,這樣輸出棧從棧頂往棧底的順序就是佇列從隊首往隊尾的順序。

漫畫演算法 學習筆記01

在計算機領域裡,演算法是一系列程式指令,用於處理特定的運算和邏輯問題。衡量演算法優劣的主要標準是時間複雜度和空間複雜度。資料結構是資料的組織 管理和儲存格式,其使用目的是為了高效的訪問和修改資料。資料結構包含陣列 鍊錶這樣的線性資料結構,也包含樹 圖這樣的複雜資料結構。資料結構 data struc...

漫畫演算法 學習筆記(03)

3.實現 4.陣列與鍊錶的比較 鍊錶 linked list 是一種在物理上非連續 非順序的資料結構,由若干節點 node 所組成。private static class node 鍊錶的第乙個節點被稱為頭節點,最後乙個節點被稱為尾節點,尾節點的next指標指向null。對於鍊錶的其中乙個節點a,...

漫畫演算法 學習筆記(11)

2.二叉堆堆自我調整 3.二叉堆的 實現 二叉堆 本質上是一種完全二叉樹,它分兩個型別。什麼是最大堆?最大堆 最大堆的任何乙個父節點的值,都大於或等於它左 右孩子節點的值。什麼是最小堆?最小堆 最小堆的任何乙個父節點的值,都小於或等於它左 右孩子節點的值。二叉堆的根節點叫作堆頂。最大堆和最小堆堆特點...