Go語言程式反轉棧


在這篇 Go 語言文章中,我們將使用遞迴和迭代方法反轉棧。棧是一種遵循後進先出 (LIFO) 原則的線性資料結構。

演算法

  • 步驟 1 − 首先,我們需要匯入 fmt 和 strconv 包。

  • 步驟 2 − 建立一個棧結構,使用 item 切片來儲存棧元素。

  • 步驟 3 − 現在,定義函式 push()、pop()、peek()、isEmpty() 和 print() 來執行棧的基本操作。

  • 步驟 4 − push() 將專案新增到棧的末尾,而 pop() 從棧中刪除最後一個專案。peek() 返回棧中的最後一個專案,而不將其刪除。

  • 步驟 5 − isEmpty() 如果棧為空則返回 true,否則返回 false;print() 列印棧的專案。

  • 步驟 6 − 現在,建立 reverseS() 函式來反轉棧。首先,它檢查棧是否為空。然後,它以反轉的方式返回棧的元素。

  • 步驟 7 − 它從棧頂彈出一個專案並將其儲存在一個名為 temp 的變數中。然後,它遞迴呼叫自身以反轉其餘的棧。棧反轉後,它呼叫 insert() 函式將彈出的專案插入到反轉棧的底部。

  • 步驟 8 − insert() 函式將專案插入到棧的底部。如果棧為空,它將專案壓入棧並返回。

  • 步驟 9 − 如果棧不為空,它從棧頂彈出一個專案並遞迴呼叫自身以將專案插入到底部。專案插入到底部後,它將彈出的專案壓回棧中。

  • 步驟 10 − 開始 main() 函式。在 main() 函式內,建立一個棧結構並用一些專案初始化一個棧。

  • 步驟 11 − 列印初始棧元素。

  • 步驟 12 − 現在,呼叫 reverseS() 函式並將棧作為引數傳遞給它。

  • 步驟 13 − 此外,使用 print() 函式列印反轉的棧元素。

示例 1

在這個例子中,我們將定義一個 reverseS() 函式,該函式用於使用遞迴方法反轉棧。

package main

import (
   "fmt"
   "strconv"
)

type Stack struct {
   items []int
}

func (s *Stack) push(item int) {
   s.items = append(s.items, item)
}

func (s *Stack) pop() int {
   l := len(s.items) - 1
   item := s.items[l]
   s.items = s.items[:l]
   return item
}
func (s *Stack) peek() int {
   return s.items[len(s.items)-1]
}

func (s *Stack) isEmpty() bool {
   return len(s.items) == 0
}

func (s *Stack) print() {
   for _, item := range s.items {
      fmt.Print(strconv.Itoa(item) + " ")
   }
   fmt.Println()
}

func reverseS(s *Stack) {
   if s.isEmpty() {
      return
   }

   temp := s.pop()
   reverseS(s)
   insert(s, temp)
}

func insert(s *Stack, item int) {
   if s.isEmpty() {
      s.push(item)
      return
   }

   temp := s.pop()
   insert(s, item)
   s.push(temp)
}

func main() {
   s := &Stack{}

   s.push(3)
   s.push(6)
   s.push(2)
   s.push(5)
   s.push(8)
   fmt.Println("Initial stack:")
   s.print()

   reverseS(s)

   fmt.Println("Updated Reversed stack:")
   s.print()
}

輸出

Initial stack:
3 6 2 5 8 
Updated Reversed stack:
8 5 2 6 3 

示例 2

在這個例子中,我們將定義一個 reverseS() 函式,該函式用於使用迭代方法反轉棧。

package main

import (
   "fmt"
)

type Stack struct {
   items []int
}

func (s *Stack) push(item int) {
   s.items = append(s.items, item)
}

func (s *Stack) pop() int {
   l := len(s.items) - 1
   item := s.items[l]
   s.items = s.items[:l]
   return item
}

func (s *Stack) peek() int {
   return s.items[len(s.items)-1]
}

func (s *Stack) isEmpty() bool {
   return len(s.items) == 0
}

func (s *Stack) reverseS() {
   if s.isEmpty() {
      return
   }

   stackSize := len(s.items)
   for i := 0; i < stackSize/2; i++ {
      temp := s.items[i]
      s.items[i] = s.items[stackSize-i-1]
      s.items[stackSize-i-1] = temp
   }
}

func (s *Stack) print() {
   for _, item := range s.items {
      fmt.Printf("%d ", item)
   }
   fmt.Println()
}

func main() {
   s := &Stack{}

   s.push(6)
   s.push(3)
   s.push(8)
   s.push(2)
   s.push(9)

   fmt.Println("Initial stack:")
   s.print()

   s.reverseS()
   fmt.Println("Updated Reversed stack:")
   s.print()
}

輸出

Initial stack:
6 3 8 2 9 
Updated Reversed stack:
9 2 8 3 6 

結論

我們已經成功編譯並執行了一個 Go 語言程式,該程式使用遞迴和迭代方法反轉棧,並附帶兩個示例。在第一個示例中,我們使用了遞迴方法;在第二個示例中,我們使用了迭代方法。

更新於:2023年4月3日

172 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告