使用栈反转字符串的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切片;在第二种方法中,我们使用了结构体来执行该函数。