成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

Go語言有隊列和棧結構嗎

Go語言中沒有隊列和棧相關的數據結構;但可以借助切片來實現棧與隊列的操作。go語言實現棧和隊列主要用到append和切片(用內置數組類型進行操作),創建棧和隊列的語法“make([]int, 0)”,入棧和入隊的語法“append(stack, 10)”,出棧的語法“v:=stack[len(stack)-1] stack = stack[:len(stack)-1]”。

Go語言有隊列和棧結構嗎

本教程操作環境:windows7系統、GO 1.18版本、Dell G3電腦。

go語言中,并沒有棧與隊列相關的數據結構,但是我們可以借助切片來實現棧與隊列的操作;接下來我們一起實現棧與隊列基本操作,并且還會實現用棧實現隊列,用隊列實現棧的操作。

實現棧與隊列基本操作

1、棧基本操作

go語言實現棧和隊列主要用到append 和切片(用內置數組類型進行操作)

//創建棧 stack := make([]int, 0) //push壓入棧 stack = append(stack, 10) //pop彈出 v := stack[len(stack)-1] stack = stack[:len(stack)-1] //檢查棧空 len(stack) == 0
登錄后復制

2、隊列基本操作

//創建隊列 queue := make([]int, 0) //enqueue入隊 queue = append(queue, 10) //dequeue出隊 v := queue[0] queue = queue[1:] //檢查隊列為空 len(queue) == 0
登錄后復制

用棧實現隊列

1、理論

使用棧來模式隊列的行為,如果僅僅用一個棧,是一定不行的,所以需要兩個棧一個輸入棧,一個輸出棧,這里要注意輸入棧和輸出棧的關系。

下面動畫模擬以下隊列的執行過程如下:

執行語句:

queue.push(1); queue.push(2); queue.pop(); 注意此時的輸出棧的操作 queue.push(3); queue.push(4); queue.pop(); queue.pop();注意此時的輸出棧的操作 queue.pop(); queue.empty();
登錄后復制

在push數據的時候,只要數據放進輸入棧就好,但在pop的時候,操作就復雜一些,輸出棧如果為空,就把進棧數據全部導入進來(注意是全部導入),再從出棧彈出數據,如果輸出棧不為空,則直接從出棧彈出數據就可以了。

最后如何判斷隊列為空呢?如果進棧和出棧都為空的話,說明模擬的隊列為空了。

2、算法題

接下來看一下LeetCode原題

232. 用棧實現隊列

請你僅使用兩個棧實現先入先出隊列。隊列應當支持一般隊列支持的所有操作(push、pop、peek、empty):

實現 MyQueue 類:

void push(int x) 將元素 x 推到隊列的末尾 int pop() 從隊列的開頭移除并返回元素 int peek() 返回隊列開頭的元素 boolean empty() 如果隊列為空,返回 true ;否則,返回 false 說明:

你 只能 使用標準的棧操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。 你所使用的語言也許不支持棧。你可以使用 list 或者 deque(雙端隊列)來模擬一個棧,只要是標準的棧操作即可。

3、思路

解決這個問題,需要一個輸出棧和輸入棧

先將數據放到輸入棧,再把數據從輸入棧放到輸出棧,此時輸出棧輸出數據的順序就和隊列一樣了,先入先出

4、代碼部分

type MyQueue struct { 	stackIn  []int // 用來保存Push數據 	stackOut []int // 用來保存Pop數據 }  // 棧構造器 func Constructor() MyQueue { 	return MyQueue{ 		stackIn:  make([]int, 0), 		stackOut: make([]int, 0), 	} }  func (this *MyQueue) Push(x int) { 	// 判斷stackOut中是否有元素,有的話全部放到stackIn 	for len(this.stackOut) != 0 { 		val := this.stackOut[len(this.stackOut)-1] 		this.stackOut = this.stackOut[:len(this.stackOut)-1] 		this.stackIn = append(this.stackIn, val) 	} 	// 將數據加進stackIn 	this.stackIn = append(this.stackIn, x) }  func (this *MyQueue) Pop() int { 	// 判斷stackIn中是否有元素,有的話全部放到stackOut 	for len(this.stackIn) != 0 { 		val := this.stackIn[len(this.stackIn)-1] 		this.stackIn = this.stackIn[:len(this.stackIn)-1] 		this.stackOut = append(this.stackOut, val) 	} 	// stackOut為零,說明沒有元素,return 0 	if len(this.stackOut) == 0 { 		return 0 	} 	// stackOut Pop 元素 	res := this.stackOut[len(this.stackOut)-1] 	this.stackOut = this.stackOut[:len(this.stackOut)-1] 	return res }  func (this *MyQueue) Peek() int { 	// 調用Pop()方法 	val := this.Pop() 	// val為零,說明沒有元素,return 0 	if val == 0 { 		return 0 	} 	// Pop()方法刪除了val,這里加上 	this.stackOut = append(this.stackOut, val) 	return val }  func (this *MyQueue) Empty() bool { 	// 兩個棧都為空,說明為空,否則不為空 	return len(this.stackOut) == 0 && len(this.stackIn) == 0 }
登錄后復制

代碼可以直接拿到力扣上運行。我已經將細節全部用注釋解釋了,如果不懂可以私信博主。

用隊列實現棧

1、理論

隊列模擬棧,其實一個隊列就夠了,那么我們先說一說兩個隊列來實現棧的思路。

隊列是先進先出的規則,把一個隊列中的數據導入另一個隊列中,數據的順序并沒有變,并沒有變成先進后出的順序。

所以用棧實現隊列, 和用隊列實現棧的思路還是不一樣的,這取決于這兩個數據結構的性質。

但是依然還是要用兩個隊列來模擬棧,只不過沒有輸入和輸出的關系,而是另一個隊列完全用又來備份的!

如下面動畫所示,用兩個隊列que1和que2實現隊列的功能,que2其實完全就是一個備份的作用,把que1最后面的元素以外的元素都備份到que2,然后彈出最后面的元素,再把其他元素從que2導回que1。

模擬的隊列執行語句如下:

queue.push(1);         queue.push(2);         queue.pop();   // 注意彈出的操作        queue.push(3);         queue.push(4);        queue.pop();  // 注意彈出的操作     queue.pop();     queue.pop();     queue.empty();
登錄后復制

Go語言有隊列和棧結構嗎

2、算法題

接下來看一下LeetCode原題225. 用隊列實現棧

請你僅使用兩個隊列實現一個后入先出(LIFO)的棧,并支持普通棧的全部四種操作(push、top、pop 和 empty)。

實現 MyStack 類:

void push(int x) 將元素 x 壓入棧頂。 int pop() 移除并返回棧頂元素。 int top() 返回棧頂元素。 boolean empty() 如果棧是空的,返回 true ;否則,返回 false 。

注意:

你只能使用隊列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 這些操作。 你所使用的語言也許不支持隊列。 你可以使用 list (列表)或者 deque(雙端隊列)來模擬一個隊列 , 只要是標準的隊列操作即可。

3、思路

用兩個隊列que1和que2實現隊列的功能,que2其實完全就是一個備份的作用,把que1最后面的元素以外的元素都備份到que2,然后彈出最后面的元素,再把其他元素從que2導回que1。

4、使用兩個隊列實現

type MyStack struct {     //創建兩個隊列     queue1 []int     queue2 []int }   func Constructor() MyStack {     return MyStack{	//初始化         queue1:make([]int,0),         queue2:make([]int,0),     } }   func (this *MyStack) Push(x int)  {      //先將數據存在queue2中     this.queue2 = append(this.queue2,x)	    //將queue1中所有元素移到queue2中,再將兩個隊列進行交換     this.Move()  }   func (this *MyStack) Move(){         if len(this.queue1) == 0{         //交換,queue1置為queue2,queue2置為空         this.queue1,this.queue2 = this.queue2,this.queue1     }else{         //queue1元素從頭開始一個一個追加到queue2中             this.queue2 = append(this.queue2,this.queue1[0])               this.queue1 = this.queue1[1:]	//去除第一個元素             this.Move()     //重復     } }  func (this *MyStack) Pop() int {     val := this.queue1[0]     this.queue1 = this.queue1[1:]	//去除第一個元素     return val  }   func (this *MyStack) Top() int {     return this.queue1[0]	//直接返回 }   func (this *MyStack) Empty() bool { return len(this.queue1) == 0 }
登錄后復制

5、優化

其實這道題目就是用一個隊列就夠了。

一個隊列在模擬棧彈出元素的時候只要將隊列頭部的元素(除了最后一個元素外) 重新添加到隊列尾部,此時在去彈出元素就是棧的順序了。

6、使用一個隊列實現

type MyStack struct {     queue []int//創建一個隊列 }   /** Initialize your data structure here. */ func Constructor() MyStack {     return MyStack{   //初始化         queue:make([]int,0),     } }   /** Push element x onto stack. */ func (this *MyStack) Push(x int)  {     //添加元素     this.queue=append(this.queue,x) }   /** Removes the element on top of the stack and returns that element. */ func (this *MyStack) Pop() int {     n:=len(this.queue)-1//判斷長度     for n!=0{ //除了最后一個,其余的都重新添加到隊列里         val:=this.queue[0]         this.queue=this.queue[1:]         this.queue=append(this.queue,val)         n--     }     //彈出元素     val:=this.queue[0]     this.queue=this.queue[1:]     return val      }   /** Get the top element. */ func (this *MyStack) Top() int {     //利用Pop函數,彈出來的元素重新添加     val:=this.Pop()     this.queue=append(this.queue,val)     return val }   /** Returns whether the stack is empty. */ func (this *MyStack) Empty() bool {     return len(this.queue)==0 }
登錄后復制

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
丰满人妻被两个按摩师| AV无码人妻中文字幕| 中国猛少妇色XXXXX| 与亲女洗澡时伦了毛片| 2020国产精品久久久久精品| MD豆传媒一二三区进站口在线| 伴郎粗大的内捧猛烈进出| 荡女小姿的YIN乱生活| 国产精品无码AV天天爽播放器| 国语对白做受XXXXX在线| 久久97超碰色中文字幕蜜芽| 旅游途中夫妻换着玩的说说搞笑| 欧美黑人巨大手机在线观看| 日本多人强伦姧人妻完整版 | 一二三四电影在线观看视频播放免| 18大禁漫画吃奶羞羞漫画| 被猛男伦流澡到高潮H| 国产精品美女乱子伦高| 久99久精品免费视频热| 欧美18VIDEOSEX性欧美| 少妇被三个黑人调教| 亚洲AV无码第一区二区三区 | 久章草在线毛片视频播放| 人妻 丝袜美腿 中文字幕| 无码熟妇人妻在线视频| 野花日本大全免费观看3中文版| JIZZJIZZ无码中国在线观| 国产成人亚洲综合无码精品| 精品无码人妻被多人侵犯aⅴ| 免费无码又爽又刺激高潮| 色综合色欲色综合色综合色综合R 色综合色欲色综合色综合色综合 色综合色天天久久婷婷基地 | 自拍偷自拍亚洲精品播放| 动漫人物插画动漫人物的视频 | AV无码动漫一区二区三区精品| 妇女AV中文精品字幕XXX| 精品无码人妻一区二区三区18| 男孩子都会夹住女孩子头发| 特级毛片A级毛片在线播放WWW| 亚洲另类激情综合偷自拍图| JAPANESEHD无码中文字| 国产亚洲成AV人片在线观看导航| 浪货趴办公桌~H揉秘书| 少妇被又大又粗又爽毛片久久黑人 | 亚洲日韩精品一区二区三区无码| YY111111少妇影院免费观| 国产无套粉嫩白浆在线| 女人私密紧致手术视频| 亚洲AⅤ在线无码播放毛片一线天| 18禁无遮挡啪啪摇乳动态图| 国产美女mv一区二区竹| 妺妺坐在我腿上勃起弄了视频| 玩丰满少妇XXXXXⅩ性麻| 与大屁股熟女啪啪喷水| 国产精品边做奶水狂喷无码| 免费看高清毛片AAAAAAAA| 无码人妻精品中文字幕| 18禁自慰网址进入| 国产在线不卡人成视频| 亲孑伦视频一区二区三区一 | 少妇人妻真实偷人精品视频| 一面亲上边一面膜下边56| 国产成人精品一区二三区在线观看 | 畜禽CROPROATION| 久久综合无码中文字幕无码TS| 我被八个男人玩到早上| 中文字幕理伦午夜福利片| 国产精品久久婷婷六月丁香| 欧美人与牲禽ⅩXXX伦交| 亚洲S久久久久一区二区| 成人免费AⅤ视频一区二区| 久久久久久中文字幕有精品| 无码AVAV无码中文字幕| A4YY午夜福利视频无码| 久久成人国产精品| 无码AV免费一区二区三区试看| 中文字幕亚洲综合久久综合| 国精产品一线二线三线| 日日碰狠狠添天天爽无码| 18精品久久久无码午夜福利| 激情偷乱人伦小说视频在线| 少妇午夜福利一区二区| 2021日韩无码| 精品人妻系列无码人妻漫画| 四虎一区二区成人免费影院网址| 97超碰中文字幕久久精品| 精品欧美H无遮挡在线看中文| 婷婷97狠狠成人免费视频| PYTHON人马大战CSDN| 老妇饥渴XXHDⅩXXOOO| 亚洲AV无码成人专区| 国产CHINESE男男GAY| 欧美在线 | 亚洲| 一区二区三区熟女少妇小牛| 狠狠亚洲婷婷综合色香五月加勒比 | 被老外添嫩苞添高潮NP电影| 蜜臀国产AV天堂久久无码蜜臀| 亚洲国产精品久久精品| 国产乱码一区二区三区免费| 肉感饱满中年熟妇日本| AV未满十八禁免费网站| 麻豆国产一卡二卡三卡| 亚洲欧洲无码精品ⅤA| 国产在线看片无码人精品| 玩弄白嫩少妇XXXXX性| 成人片黄网站色多多WWW | AV无码波多野结衣| 免费夜色污私人网站在线观看| 亚洲日韩AV片在线观看| 韩国精品一区二区三区无码视频| 天天躁夜夜躁狠狠是什么心态| 成人亚洲一区无码久久| 日本高清视频WWW| H国产小视频福利免费视频| 内射人妻无码色AV| 中文在线А√在线| 另类极品VPSWINDOWS| 又色又爽又黄的视频APP软件下| 精品一区二区三区在线成人 | 精品国际久久久久999波多野| 亚洲AV秘 无码一区二区三密桃| 国产精品久线在线观看| 乌克兰13一14处A交| 国产精品久久777777| 无码AV大香线蕉| 国产99在线 | 亚洲| 色欲AV蜜臀AV一区在线| 成人午夜高潮刺激免费视频| 日本XXX色视频| 成熟丰满熟妇偷拍XXXXX| 日韩精品一区二区三区中文无码| 成熟丰满女人丰满妇女aⅴ| 日韩一区国产二区欧美三区| 初尝黑人巨砲波多野结衣| 上面一个摸下面一个手念什么| 顶级欧美熟妇高清XXXXX| 色欲蜜臀av无码久久浪潮一区| 粉嫩呦福利视频导航大全| 四季AV无码专区AV浪潮| 国产精品麻豆欧美日韩WW | 国产日韩AV无码免费一区二区三 | 日本免费一区二区三区四区五六区| 把腿扒开做爽爽视频| 日韩人妻OL丝袜AV一二区| 国产AV精国产传媒| 无遮挡粉嫩小泬久久久久久久动漫 | 少妇被又粗又硬猛烈进出小说| 隔壁人妻偷人BD中字| 无码少妇精品一区二区免费动态| 国产我和子的与子乱视频| 亚洲AV永久无码精品九九| 精品人妻一区二区三区四区在线 | 波多野结衣放荡的护士| 色综合色狠狠天天综合网| 国产三级在线观看播放视频| 亚洲国产精品久久青草无码| 久久久久亚洲AV成人网人人网站| 中文字幕亚洲欧美日韩在线不卡| 欧美国产成人久久精品| 方辰苏婉儿是哪本小说的主角 | 人妻少妇波多野结衣黑人 | 99国产欧美久久久精品| 日本少妇毛茸茸高潮| 国产精品久久久久久妇女| 亚洲欧洲日产国码无码| 妺妺窝人体色WWW在线观看婚闹| 办公室被吃奶好爽在线观看视频| 色橹橹欧美在线观看视频高清| 国产精品视频免费播放| 亚洲人成电影一区二区在线| 妺妺晚上扒我内裤吃我精子H| 成 人 网 站国产免费观看 | 国产美女极度色诱视频WWW| 亚洲色欲AV无码成人专区| 欧美极品少妇XXXXⅩ| 国产成人AV三级在线观看| 亚洲国产精品一区二区成人片| 麻豆极品JK丝袜自慰喷水久久| 爸爸你不能谢在里面来| 午夜伦情电午夜伦情电影| 久久不见久久见中文字幕免费 | 国产精品无码午夜福利| 野花香在线视频免费观看第一集| 欧洲一本到卡二卡三卡乱码| 国产老妇伦国产熟女老妇视频| 亚洲午夜国产精品无码| 轻点灬大JI巴太粗太长了| 国产精品一卡二卡三卡四卡 | 麻豆影视视频高清在线观看| 成人精品一卡2卡3卡4卡新区乱| 亚洲AV成人AV天堂| 男人的又粗又长又硬有办法吗| 国产CHINESE男男GAYGAY网站| 亚洲色偷偷偷网站色偷一区人人澡 | 色既是空在线观看| 久久 国产 尿 小便 嘘嘘| 差差漫画页面免费漫画欢迎你 | 娇妻出轨哀求高潮喷水| 爱情岛网站亚洲禁18进入| 亚洲AV永久一区二区三区蜜桃| 欧美成人精品三级网站视频|