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 }