Go語言中沒有佇列和堆疊相關的資料結構;但可以藉助切片來實作堆疊與佇列的操作。 go語言實作堆疊和佇列主要用到append和切片(用內建數組類型進行操作),創建堆疊和佇列的語法“make([]int, 0)”,入棧和入隊的語法“append(stack, 10)”,出棧的語法“v:=stack[len(stack)-1] stack = stack[:len(stack)-1]”。
本教學操作環境: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原題
請你只使用兩個堆疊實作先入先出佇列。佇列應支援一般佇列支援的所有操作(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();
#2、演算法題
##接下來看LeetCode原題请你仅使用两个队列实现一个后入先出(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 }
以上是Go語言有佇列和堆疊結構嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Golang和Python的主要區別在於並發模型、類型系統、性能和執行速度。 1.Golang使用CSP模型,適用於高並發任務;Python依賴多線程和GIL,適合I/O密集型任務。 2.Golang是靜態類型,Python是動態類型。 3.Golang編譯型語言執行速度快,Python解釋型語言開發速度快。

Golang通常比C 慢,但Golang在並發編程和開發效率上更具優勢:1)Golang的垃圾回收和並發模型使其在高並發場景下表現出色;2)C 通過手動內存管理和硬件優化獲得更高性能,但開發複雜度較高。

Golang在雲計算和DevOps中的應用廣泛,其優勢在於簡單性、高效性和並發編程能力。 1)在雲計算中,Golang通過goroutine和channel機制高效處理並發請求。 2)在DevOps中,Golang的快速編譯和跨平台特性使其成為自動化工具的首選。

Golang和C 在執行效率上的表現各有優勢。 1)Golang通過goroutine和垃圾回收提高效率,但可能引入暫停時間。 2)C 通過手動內存管理和優化實現高性能,但開發者需處理內存洩漏等問題。選擇時需考慮項目需求和團隊技術棧。

Golang更適合高並發任務,而Python在靈活性上更有優勢。 1.Golang通過goroutine和channel高效處理並發。 2.Python依賴threading和asyncio,受GIL影響,但提供多種並發方式。選擇應基於具體需求。

Golang和C 在性能上的差異主要體現在內存管理、編譯優化和運行時效率等方面。 1)Golang的垃圾回收機制方便但可能影響性能,2)C 的手動內存管理和編譯器優化在遞歸計算中表現更為高效。

selectgolangforhighpperformanceandcorrency,ifealforBackendServicesSandNetwork程序; selectpypypythonforrapiddevelopment,dataScience和machinelearningDuetoitsverserverserverserversator versator anderticality andextility andextentensivelibraries。

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。Golang以其并发模型和高效性能著称,Python则以简洁语法和丰富库生态系统著称。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

WebStorm Mac版
好用的JavaScript開發工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Atom編輯器mac版下載
最受歡迎的的開源編輯器