Go 程序打印星号而不是实际字符

我正在编写一个将后缀表达式转换为其前缀形式的程序(因此它应该将此“ABC/-AK/L-*”转换为此“*-A/BC-/AKL”。规则很简单:如果它是一个字母或一个数字(操作数),然后它被压入堆栈,如果它是一个运算符,那么堆栈的最后两个字符(比如说op1(最后一个)和op2(最后一个之后的那个))是被弹出,然后与运算符连接 (temp = operator + op2 + op1),然后将此 temp 压入堆栈。

问题是当使用 pop 时,操作数变成星号,我不知道为什么。也许需要指针?有人可以告诉我我做错了什么吗?非常感谢!

输入:“ABC/-AK/L-*”

预期输出:“*-A/BC-/AKL”

观察到的输出:“[***]”


import (

    "fmt"

)


type Stack []string


func (s *Stack) isEmpty() bool {

    return len(*s) == 0

}


func (s *Stack) push(value string) {

    *s = append(*s, value)

}


func (s *Stack) pop() (string, bool) {

    if s.isEmpty() {

        return "", false

    } else {

        elementIndex := len(*s) - 1

        element := (*s)[elementIndex]

        *s = (*s)[:elementIndex]

        return element, true

    }

}


func isOperator(character string) bool {

    switch character {

    case "+", "-", "*", "/":

        return true

    default:

        return false

    }


}


func input() {

    var stack Stack

    fmt.Print("Please input the equation without spaces: \n")

    input := "ABC/-AK/L-*"



    for _, character := range input {

        valueCheck := isOperator(string(character))

        if valueCheck == true {

            operand1 := input[len(input)-1]

            stack.pop()

            operand2 := input[len(input)-1]

            stack.pop()


            var temp string

            temp = string(character) + string(operand2) + string(operand1)

            stack.push(temp)


        } else {

            stack.push(string(character))

        }

    }


    fmt.Print(stack)


}


func main() {

    input()

}


达令说
浏览 99回答 1
1回答

尚方宝剑之说

func input() {    var stack Stack    fmt.Print("Please input the equation without spaces: \n")    input := "ABC/-AK/L-*"    for _, character := range input {        valueCheck := isOperator(string(character))        if valueCheck {            operand1 := stack[len(stack)-1]            stack.pop()            operand2 := stack[len(stack)-1]            stack.pop()            temp := string(character) + string(operand2) + string(operand1)            stack.push(temp)        } else {            stack.push(string(character))        }    }这将为您提供您所期望的。一些旁注:if valueCheck == true太多了,因为valueCheck是布尔类型var temp stringtemp = string(character) + string(operand2) + string(operand1)也有点冗长temp := string(character) + string(operand2) + string(operand1)足够的。并且最好熟悉一下dlv debugger,这样下次你迷茫的时候会节省一些时间和精力。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go