使用棧反轉字串的Go語言程式


在本文中,我們將學習如何使用Go程式語言和棧來反轉字串。棧是一種符合後進先出 (LIFO) 原則的資料結構。這意味著第一個被移除的元素將是最近新增到棧中的元素。Go語言內建的“container/list”包實現了雙向連結串列,可以用它來構建棧。但是,Go語言中經常使用切片(動態陣列)來實現棧。讓我們看看如何使用不同的例子來執行它。

方法一:將字串轉換為rune切片

在這個方法中,我們將學習如何透過將字串轉換為rune切片來使用棧反轉字串。rune是Go語言中字元的等價物,因此它首先將字串切分成rune,然後將每個rune壓入棧中。下一步是從棧中彈出每個rune,並將其新增到一個新的字串中。這樣,原始字串就被反轉了。然後,主函式對字串使用反轉函式,列印原始字串和反轉後的字串。讓我們看看它的執行過程。

語法

func append(slice, element_1, element_2…, element_N) []T

append函式用於向陣列切片新增值。它接受多個引數。第一個引數是要向其中新增值的陣列,後跟要新增的值。然後,該函式返回包含所有值的最終陣列切片。

演算法

  • 步驟 1 − 建立一個名為main的包,並在程式中宣告fmt(格式化包),其中main生成可執行檔案示例,fmt幫助格式化輸入和輸出。

  • 步驟 2 − 建立一個名為reverse的函式,並建立一個變數來儲存反轉後的字串和一個空棧來儲存它。

  • 步驟 3 − 將傳入函式的輸入字串轉換為rune切片。

  • 步驟 4 − 將切片中的每個rune依次壓入棧中。

  • 步驟 5 − 遍歷棧,將每個rune從棧中彈出並新增到反轉後的字串中。

  • 步驟 6 − 返回反轉後的字串作為結果。

  • 步驟 7 − 在主函式中呼叫reverse函式,並傳入一個需要反轉的字串作為引數。

  • 步驟 8 − 使用fmt.Println()函式(其中ln表示換行)在控制檯上列印反轉後的字串。

示例

在下面的示例中,我們將透過將字串轉換為rune切片來反轉字串。

package main
import (
   "fmt"
)

func reverse(str string) string {
   runes := []rune(str)   //convert the string to slice of runes
   var stack []rune
   for _, v := range runes {
      stack = append(stack, v)     //push rune in the slice 
   }
   var reversed string
   for i := len(stack) - 1; i >= 0; i-- {
      reversed += string(stack[i])
   }
   return reversed     //return reversed string
}

func main() {
   original := "Hello, alexa!"
   fmt.Println("The original string given here is:", original)
   reversed := reverse(original)
   fmt.Println("The reversed string here is:", reversed) //print reversed string
}

輸出

The original string given here is: Hello, alexa!
The reversed string here is: !axela ,olleH

方法二:在示例中使用結構體輔助棧

在這個方法中,我們將使用結構體來反轉字串。上述程式使用了Stack結構體,它實現了Push和Pop方法,用於向棧中新增和移除項。在主函式中,建立Stack結構體的例項後,使用for迴圈將輸入字串中的每個字元壓入棧中。使用第二個for迴圈,使用Pop方法將每個字元從棧中彈出,新增到一個新字串中,然後列印為反轉後的字串。讓我們看看它的執行過程。

演算法

  • 步驟 1 − 建立一個名為main的包,並在程式中宣告fmt(格式化包),其中main生成可執行檔案示例,fmt幫助格式化輸入和輸出。

  • 步驟 2 − 將Push和Pop函式整合到名為Stack的結構體中,分別用於向棧中新增和移除項。

  • 步驟 3 − 在主函式中初始化一個Stack結構體的例項,並接收一個需要反轉的字串作為輸入。

  • 步驟 4 − 使用for迴圈,使用Push方法將輸入字串的每個字元壓入棧中。

  • 步驟 5 − 建立一個名為reversed的空字串。

  • 步驟 6 − 使用第二個for迴圈,使用Pop方法從棧中移除字元,並將其新增到reversed字串中。

  • 步驟 7 − 使用fmt.Println()函式(其中ln表示換行)列印反轉後的字串作為輸出。

  • 步驟 8 − 由於我們兩次迭代字串,一次將字元壓入棧中,一次將其從棧中彈出,因此此方法的總體時間複雜度為O(n),其中n是輸入字串的長度。由於使用了第二個棧來儲存字元,因此此方法的空間複雜度也是O(n)。

示例

在下面的示例中,我們將使用結構體輔助棧來反轉字串。

package main
import "fmt"

type Stack struct { // Stack struct
   items []rune
}

func (str *Stack) Push(item rune) { //push method to items in stack
   str.items = append(str.items, item)
}

func (str *Stack) Pop() rune { //pop method to pop items from the stack
   item := str.items[len(str.items)-1]
   str.items = str.items[:len(str.items)-1]
   return item
}

func main() {
   stack := &Stack{}   //create a stack
   str := "hello alexa"  //create a string
   fmt.Println("The original string is:", str)	
   for _, char := range str {
      stack.Push(char)
   }
   reversed := ""  //create empty string to add reversed string
   for i := 0; i < len(str); i++ {
      reversed += string(stack.Pop())  //pop items from stack and add to newly created string
   }
   fmt.Println("The reversed string is:")
   fmt.Println(reversed) // Output: "dlrow olleh"
}

輸出

The original string is: hello alexa
The reversed string is:
axela olleh

結論

我們透過不同的示例執行了使用棧反轉字串的程式。在第一個示例中,我們將字串轉換為rune切片;在第二種方法中,我們使用了結構體來執行該函式。

更新於:2023年2月20日

370 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告