1 package main 2 import ( 3 "bufio" 4 "fmt" 5 "os" 6 "strconv" 7 ) 8 type Stack struct { 9 i int 10 data [10]int 11 } 12 func (s *Stack) Push(a int) { 13 fmt.Printf("push:data:%d,pos:%d\n", a, s.i) 14 s.data[s.i] = a 15 s.i++ 16 } 17 func (s *Stack) Pop() int { 18 s.i-- 19 return s.data[s.i] 20 } 21 22 var reader *bufio.Reader = bufio.NewReader(os.Stdin) 23 var st Stack 24 func main() { 25 for { 26 s, err := reader.ReadString('\n') 27 var token string 28 if err != nil { 29 println("Good Bye!") 30 continue 31 } 32 for _, c := range s { 33 switch { 34 case c >= '0' && c <= '9': 35 token += string(c) 36 case c == ' ': // 一個數輸入結束 37 if token != "" { 38 r, _ := strconv.Atoi(token) 39 st.Push(r) 40 token = "" 41 } 42 case c == '+': 43 st.Push(st.Pop() + st.Pop()) 44 case c == '*': 45 st.Push(st.Pop() * st.Pop()) 46 case c == '-': 47 p := st.Pop() 48 q := st.Pop() 49 st.Push(q-p) 50 case c == '/': 51 p := st.Pop() 52 q := st.Pop() 53 if p != 0 { 54 st.Push(q/p) 55 } else { 56 fmt.Printf("divisor couldn't be zero\n") 57 } 58 case c == '\n': 59 fmt.Printf("%d\n",st.Pop()); 60 case c == 'q': 61 return 62 63 } 64 } 65 } 66 }