Go入门 - stack包

1、建立一个独立的包,为stack的实现创建一个合适的包,Push Pop和Stack类型需要被导出。并为此包编写一个单元测试,至少测试Push后Pop的工作情况。

stack-as-package.go文件

package stack

type Stack struct {
	i 	 int
	data [10]int
}

func (s *Stack) Push(k int)  {
	s.data[s.i] = k
	s.i++
}

func (s *Stack) Pop() (ret int) {
		s.i--
		ret = s.data[s.i]
		return
}

pushpop_test.go

package stack

import "testing"

func TestPushPop(t *testing.T)  {
	c := new(Stack)
	c.Push(5)
	if c.Pop() != 5 {
		t.Log("Pop doesn't give 5")
		t.Fail()
	}
}

依次执行命令

> mkdir $GOPATH/src/stack

> cp pushpop_test.go $GOPATH/src/stack

> cp stack-as-package.go  $GOPATH/src/stack

> go test stack

 

2、使用stack包创建逆波兰计算器

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

var reader *bufio.Reader = bufio.NewReader(os.Stdin)
var st = new(Stack)

type Stack struct {
	i int
	data [10]int
}

func (s *Stack) Push(k int)  {
	if s.i +1 >9 {
		return
	}
	s.data[s.i] = k
	s.i++
}

func (s *Stack) Pop() (ret int) {
	s.i--
	if s.i < 0 {
		s.i = 0
		return
	}
	ret = s.data[s.i]
	return
}

func main()  {
	for {
		s, err := reader.ReadString('\n')
		var token string
		if err != nil {
			return
		}
		for _,c := range s {
			switch {
				case c > '0' && c < '9' :
					token = token + string(c)
				case c == ' ':
					r,_ := strconv.Atoi(token)
					st.Push(r)
					token = ""
				case c == '+':
					fmt.Printf("%d\n",st.Pop() + st.Pop())
				case c == '*':
					fmt.Printf("%d\n",st.Pop() * st.Pop())
				case c == '-':
					fmt.Printf("%d\n",st.Pop() - st.Pop())
				case c == 'q':
					return
				default:
					//error
			}

		}
	}
}

如程序所示:输入数字后输入空格,此数字才会被写入到栈中

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值