栈的数据结构特点是先进后出,如下图
代码实现
package line
type Stack struct {
items []interface{}
length int
}
func NewStack(cap int) *Stack {
return &Stack{
items: make([]interface{}, 0, cap),
}
}
func (this *Stack) Push(value interface{}) {
this.items = append(this.items, value)
this.length++
}
func (this *Stack) IsEmpty() bool {
return this.length < 1
}
func (this *Stack) Len() int {
return this.length
}
func (this *Stack) Cap() int {
return cap(this.items)
}
func (this *Stack) Top() (value interface{}, exists bool) {
if this.length < 1 {
return
}
exists = true
value = this.items[ this.length -1]
return
}
func (this *Stack) Pop() (value interface{}, exists bool) {
if this.length < 1 {
return
}
exists = true
value = this.items[this.length-1]
this.items = this.items[:this.length -1]
this.length--
return
}
测试代码
package line
import "testing"
func TestStack(t *testing.T) {
stack := NewStack(10)
empty := stack.IsEmpty()
if !empty {
t.Fatalf("want true, got %#v", empty)
}
cap := stack.Cap()
if cap != 10 {
t.Fatalf("want 10, got %#v", cap)
}
stack.Push(45)
length := stack.Len()
if length != 1 {
t.Fatalf("want 1, got %#v", length)
}
cap = stack.Cap()
if cap != 10 {
t.Fatalf("want 10, got %#v", cap)
}
stack.Push(54)
value, _ := stack.Top()
if value != 54 {
t.Fatalf("want 54, got %#v", value)
}
value, _ = stack.Pop()
if value != 54 {
t.Fatalf("want 54, got %#v", value)
}
value, _ = stack.Pop()
if value != 45 {
t.Fatalf("want 45, got %#v", value)
}
if !stack.IsEmpty() {
t.Fatalf("want true, got false")
}
}