我正在撰寫一個程式,將后綴運算式轉換為它的前綴形式(所以它應該把這個“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()
}
uj5u.com熱心網友回復:
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 string
temp = string(character) string(operand2) string(operand1)
也有點冗長
temp := string(character) string(operand2) string(operand1)
足夠。
并且最好熟悉一下dlv除錯器,這樣可以在您下次不知所措時節省一些時間和精力。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/473035.html
標籤:去
