package main import ( "bufio" "fmt" "os" "strconv" "strings" ) var stack []float64 func pop() float64 { var x float64 if len(stack) > 0 { x, stack = stack[len(stack)-1], stack[:len(stack)-1] } return x } func push(v float64) { stack = append(stack, v) } func addOp(v1, v2 float64) float64 { fmt.Printf("%f + %f = %f\n", v1, v2, (v1 + v2)) return v1 + v2 } func subtractOp(v1, v2 float64) float64 { fmt.Printf("%f - %f = %f\n", v1, v2, (v1 - v2)) return v1 - v2 } func multiplyOp(v1, v2 float64) float64 { fmt.Printf("%f * %f = %f\n", v1, v2, (v1 * v2)) return v1 * v2 } func divideOp(v1, v2 float64) float64 { fmt.Printf("%f / %f = %f\n", v1, v2, (v1 / v2)) return v1 / v2 } func main() { fmt.Println("stack calculator") var in string reader := bufio.NewReader(os.Stdin) for { fmt.Print(stack) fmt.Print(" > ") in, _ = reader.ReadString('\n') in = strings.TrimSpace(in) switch in { case ".": break case "+": doStackOperation(addOp) case "-": doStackOperation(subtractOp) case "*": doStackOperation(multiplyOp) case "/": doStackOperation(divideOp) default: val, err := strconv.ParseFloat(in, 64) if err != nil { fmt.Println(err.Error()) fmt.Println("Valid inputs: +, -, /, *, ") fmt.Println("'.' by itself to quit") } else { push(val) } } if in == "." { break } } } func doStackOperation(op func(float64, float64) float64) { if len(stack) < 2 { fmt.Println("Not enough on stack to add") return } v1, v2 := pop(), pop() push(op(v1, v2)) }