使用栈反转字符串的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 次浏览

启动您的职业生涯

通过完成课程获得认证

开始学习
广告