栈和队列互相实现,一文弄懂它们的关系
?
前言
棧和隊列是比較基礎的數據結構。無論在工作中,還是在面試中,棧和隊列都用的比較多。在計算機的世界,你會看到隊列和棧,無處不在。
?
棧:一個先進后出的數據結構
隊列:一個先進先出的數據結構
?
棧和隊列這兩種數據結構,同時也存在某種聯系。用棧可以實現隊列,用隊列也可以實現棧。
?
海邊風景不錯,欣賞一下風景,下面開始步入正題。學完這篇,咱們再接著看風景。
?
兩個棧實現一個隊列
思路:讓數據入stack1,然后棧stack1中的數據出棧并入到棧stack2,然后出stack2。
代碼如下:
先調用 AppendTail 函數將所有元素插入 stack1,在調用 DeleteHead 函數將 stack1 中的元素轉移到 stack2 中,再將元素再出棧。
再調用 DeleteHead 時,先判斷 statck2 是否為空,為空則將 stack1 元素移動到 stack2 中,然后將 stack2 中的棧頂元素保存,并彈棧。
?
兩個隊列實現一個棧
思路:兩個隊列實現一個棧,使用了隊列交換的思想。
?
代碼如下:
type?MyStack?struct?{queue1,?queue2?[]int }//構造函數 func?Constructor()?(s?MyStack)?{return }func?(s?*MyStack)?Push(x?int)?{s.queue2?=?append(s.queue2,?x)for?len(s.queue1)?>?0?{s.queue2?=?append(s.queue2,?s.queue1[0])s.queue1?=?s.queue1[1:]}s.queue1,?s.queue2?=?s.queue2,?s.queue1 }func?(s?*MyStack)?Pop()?int?{v?:=?s.queue1[0]s.queue1?=?s.queue1[1:]return?v }func?(s?*MyStack)?Top()?int?{return?s.queue1[0] }func?(s?*MyStack)?Empty()?bool?{return?len(s.queue1)?==?0 }?
先將元素入對到 queue2,此時 queue1 為0,交換 queue2 和 queue1。此時 queue2 為0,queue1 中有1個元素。
再執行push操作時,len(queue1)?> 0,此時再把 queue1 中的元素插入queue2 的尾部,然后將 queue2 和 queue1 進行交換。
此時相當于,插入 queue2 的兩個元素的位置發生了交換并保存在 queue1中。最后將 queue1 中的元素出隊,這樣就可以保證后插入的元素先出。
不斷執行 push 操作就行。
??
一個隊列實現一個棧
思路:使用一個隊列時,將當前插入元素前面的所有元素,先出隊再入隊即可。
代碼如下:
type?MyStack?struct?{queue?[]int }func?Constructor()?(s?MyStack)?{return }func?(s?*MyStack)?Push(x?int)?{n?:=?len(s.queue)s.queue?=?append(s.queue,?x)for?;?n?>?0;?n--?{s.queue?=?append(s.queue,?s.queue[0])s.queue?=?s.queue[1:]} }func?(s?*MyStack)?Pop()?int?{v?:=?s.queue[0]s.queue?=?s.queue[1:]return?v }func?(s?*MyStack)?Top()?int?{return?s.queue[0] }func?(s?*MyStack)?Empty()?bool?{return?len(s.queue)?==?0 }
每次執行 push 操作,如果queue存在元素,則將新插入元素前的所有元素出隊,然后依次進隊。這樣新插入的元素就在隊首了。
?
絮叨
棧和隊列作為基礎的數據,大家務必掌握其性質和功能,知道它們之間的某種依存關系,才能靈活運用。
上面的算法雖然很簡單,但是思路很巧妙,還有其他解法,大家也可仔細研究,必有收獲。有本數據結構的書<<大話數據結構>>推薦給大家。
?
專注后臺開發相關技術,廣度深度并存,干貨情懷同在。
微信搜索【盼盼編程】關注這個不一樣的程序員。
總結
以上是生活随笔為你收集整理的栈和队列互相实现,一文弄懂它们的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法:多数元素,多种解法
- 下一篇: linux下调试core dump方式汇