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
當作輸出棧,用於dequeue
和peek
操作。每次dequeue
或peek
時,若輸出棧為空則將輸入棧的全部資料依次彈出並壓入輸出棧,這樣輸出棧從棧頂往棧底的順序就是佇列從隊首往隊尾的順序。
漫畫演算法 學習筆記01
在計算機領域裡,演算法是一系列程式指令,用於處理特定的運算和邏輯問題。衡量演算法優劣的主要標準是時間複雜度和空間複雜度。資料結構是資料的組織 管理和儲存格式,其使用目的是為了高效的訪問和修改資料。資料結構包含陣列 鍊錶這樣的線性資料結構,也包含樹 圖這樣的複雜資料結構。資料結構 data struc...
漫畫演算法 學習筆記(03)
3.實現 4.陣列與鍊錶的比較 鍊錶 linked list 是一種在物理上非連續 非順序的資料結構,由若干節點 node 所組成。private static class node 鍊錶的第乙個節點被稱為頭節點,最後乙個節點被稱為尾節點,尾節點的next指標指向null。對於鍊錶的其中乙個節點a,...
漫畫演算法 學習筆記(11)
2.二叉堆堆自我調整 3.二叉堆的 實現 二叉堆 本質上是一種完全二叉樹,它分兩個型別。什麼是最大堆?最大堆 最大堆的任何乙個父節點的值,都大於或等於它左 右孩子節點的值。什麼是最小堆?最小堆 最小堆的任何乙個父節點的值,都小於或等於它左 右孩子節點的值。二叉堆的根節點叫作堆頂。最大堆和最小堆堆特點...