Golang 使用栈将字符串反转

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切片,而在第二种方法中,我们使用结构体来执行函数。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程