使用棧反轉字串的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切片;在第二種方法中,我們使用了結構體來執行該函式。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP