Golang 使用栈将字符串反转
在本文章中,我们将看到如何使用栈和Go编程将字符串反转。栈是Go中符合先进后出(LIFO)的数据结构。这意味着将被消除的第一个元素将是最近添加到栈中的元素。双向链表是通过内置的Go包”container/list”来实现的,可以用来构建一个栈。尽管如此,在Go中,切片(动态数组)通常被用来实现栈。让我们看看使用不同示例集来执行它。
方法1:将字符串转换为字符切片
在这种方法中,我们将看到如何将字符串转换为字符切片并使用栈来反转字符串。字符切片是Go的字符等价物,因此它首先将字符串切成字符切片,然后将每个字符推入栈中。下一步是从栈中移除每个字符,并将其添加到一个新的字符串中。结果是原始字符串被颠倒过来。反转函数然后由主函数在一个字符串上使用,该字符串打印出原始字符串和反转后的字符串。让我们看看它的执行。
语法
func append(slice, element_1, element_2…, element_N) []T
append函数用于向数组切片添加值。它需要多个参数。第一个参数是要添加值的数组,后面是要添加的值。该函数返回包含所有值的最终数组切片。
步骤
- 步骤1 - 创建一个package main,并在程序中声明fmt(format包)包,主要用于生成可执行的程序,fmt用于格式化输入和输出。
-
步骤2 - 创建一个函数reverse,并创建一个变量用于存储反转后的字符串和一个空的栈来保存它。
-
步骤3 - 将传入函数的输入字符串转换为rune切片。
-
步骤4 - 逐个将切片中的每个rune推送到栈中。
-
步骤5 - 当遍历栈时,将每个rune从栈中弹出并添加到反转后的字符串中。
-
步骤6 - 返回被反转的字符串作为结果。
-
步骤7 - 从main函数调用带有一个参数的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
方法2:使用struct来实现栈的示例
在这个方法中,我们将使用struct来反转一个字符串。这个程序中使用了Stack struct,它实现了Push和Pop方法,用于往栈中添加和删除项目。在main函数中,通过一个for循环将输入字符串的每个字符放入栈中,创建了一个Stack struct的实例。然后,通过第二个for循环从栈中取出字符,将其加入到一个新的字符串中,然后将反转后的字符串打印出来。让我们看看它的执行过程。
步骤
- 步骤 1 - 在程序中创建一个包main并声明fmt(格式化包)包,其中main生成可执行的示例,fmt用于格式化输入和输出。
-
步骤 2 - 将Push和Pop函数合并到一个名为Stack的struct中,用于添加和删除栈中的元素。
-
步骤 3 - 在main函数中初始化一个Stack struct实例,并将要反转的字符串作为输入。
-
步骤 4 - 使用for循环和Push方法将输入字符串的每个字符推入栈中。
-
步骤 5 - 创建一个名为reversed的空字符串。
-
步骤 6 - 使用第二个for循环通过使用Pop函数将每个字符添加到reversed字符串中。
-
步骤 7 - 使用fmt.Println()函数将反转的字符串打印出来,其中ln表示换行。
-
步骤 8 - 由于我们两次遍历字符串,一次是将字符放入栈中,一次是从栈中弹出字符,因此这种方法的总体时间复杂度为O(n),其中n是输入字符串的长度。由于使用了另一个栈来存储字符,这种技术的空间复杂度也是O(n)。
示例
在下面的示例中,我们将使用struct来通过栈来反转字符串:
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切片,而在第二种方法中,我们使用结构体来执行函数。
极客笔记