我对Go和堆栈溢出都是全新的,所以请耐心等待。我正在使用go构建一个简单的计算器,我正在尝试为浮点数添加功能。
程序接受一个字符串(例如:" 2 + 3")并显示结果。它可以很好地读取和计算整数,但是当程序遇到小数时我遇到了问题。它在遇到“'”时会使用嵌套的switch语句。它运行嵌套的switch语句,直到它命中空白。它应该计算与整数值相同,唯一的区别是它将值除以10(将值移动到正确的值到thenths hundreths thousanths等)但是当我尝试运行它时,它只是停止,没有错误或任何东西,它只是挂在那里,让我强行关闭程序。
这是我的代码(当我到达案例时,我的错误发生了。':其他一切正常):
package main
import (
"bufio"
"fmt"
"os"
"stack"
)
var operatorStack = stack.NewStack()
var operandStack = stack.NewStack()
func precedence(op byte) uint8 {
switch op {
case '+', '-': return 0
case '*', '/': return 1
default: panic("illegal operator")
}
}
func apply() {
op := operatorStack.Pop().(byte)
right := operandStack.Pop().(float64)
left := operandStack.Pop().(float64)
switch op {
case '+': operandStack.Push(left + right)
case '-': operandStack.Push(left - right)
case '*': operandStack.Push(left * right)
case '/': operandStack.Push(left / right)
default: panic("illegal operator")
}
}
func main() {
// Read a from Stdin.
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
line := scanner.Text()
//
for i := 0; i < len(line); {
switch line[i] {
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
v := float64(0)
for {
v = v * 10 + float64(line[i] - '0')
i++
if i == len(line) || !('0' <= line[i] && line[i] <= '9') {
break
}
}
operandStack.Push(v)
case '+', '-', '*', '/':
for !operatorStack.IsEmpty() && precedence(operatorStack.Top().(byte)) >= precedence(line[i]) {
apply()
}
operatorStack.Push(line[i])
i++
case ' ': i++
case '.':
for b := line[i]; b != ' '; {
switch line[i] {
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
v := float64(0)
for {
v = v / 10 + float64(line[i] - '0')
i++
if i == len(line) || !('0' <= line[i] && line[i] <= '9') {
break
}
}
operandStack.Push(v)
case ' ':
operatorStack.Push('+')
break
}
}
default: panic("illegal character")
}
}
for !operatorStack.IsEmpty() {
apply()
}
r := operandStack.Pop().(float64)
fmt.Println(r)