日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

栈和队列互相实现,一文弄懂它们的关系

發布時間:2025/6/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 栈和队列互相实现,一文弄懂它们的关系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

前言

棧和隊列是比較基礎的數據結構。無論在工作中,還是在面試中,棧和隊列都用的比較多。在計算機的世界,你會看到隊列和棧,無處不在。
?

棧:一個先進后出的數據結構

隊列:一個先進先出的數據結構
?

棧和隊列這兩種數據結構,同時也存在某種聯系。用棧可以實現隊列,用隊列也可以實現棧。

?


海邊風景不錯,欣賞一下風景,下面開始步入正題。學完這篇,咱們再接著看風景。

?

兩個棧實現一個隊列

思路:讓數據入stack1,然后棧stack1中的數據出棧并入到棧stack2,然后出stack2。

代碼如下:

type?CQueue?struct?{stack1,?stack2?*list.List }//構造函數???? func?Constructor()?CQueue?{return?CQueue{stack1:?list.New(),stack2:?list.New(),} }//尾部插入 func?(this?*CQueue)?AppendTail(value?int)??{this.stack1.PushBack(value) }//頭部刪除,back函數返回其list最尾部的值 func?(this?*CQueue)?DeleteHead()?int?{//如果第二個棧為空if?this.stack2.Len()?==?0?{for?this.stack1.Len()?>?0?{this.stack2.PushBack(this.stack1.Remove(this.stack1.Back()))}}if?this.stack2.Len()?!=?0?{e?:=?this.stack2.Back()this.stack2.Remove(e)return?e.Value.(int)}return?-1 }


先調用 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存在元素,則將新插入元素前的所有元素出隊,然后依次進隊。這樣新插入的元素就在隊首了。

?

絮叨

棧和隊列作為基礎的數據,大家務必掌握其性質和功能,知道它們之間的某種依存關系,才能靈活運用。

上面的算法雖然很簡單,但是思路很巧妙,還有其他解法,大家也可仔細研究,必有收獲。有本數據結構的書<<大話數據結構>>推薦給大家。



?


專注后臺開發相關技術,廣度深度并存,干貨情懷同在。
微信搜索【盼盼編程】關注這個不一樣的程序員。

總結

以上是生活随笔為你收集整理的栈和队列互相实现,一文弄懂它们的关系的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。