NOTE

2.6 stack

1. 是什么 - 后进先出 1.1. 数据结构 - 动态数组或链表 1.2. API 2. 实现 2.1. 测试

Data Structures & Algorithms创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 是什么

  • 后进先出

1.1. 数据结构

  • 动态数组或链表

1.2. API

type IStack interface {
	//打印所有元素
	String() string
	//获取元素长度
	Length() int
	//是否为空
	IsEmpty() bool
	//往栈顶压入一个元素,O(1)
	Push(e model.Comparable) error
	//从栈顶弹出一个元素,O(1)
	Pop() (model.Comparable, error)
	//查询栈顶元素,O(1)
	Peek() (model.Comparable, error)
}

2. 实现


type Stack struct {
	array array.IArray
}

func (s *Stack) String() string {
	str := fmt.Sprintf("length=%v, data=[", s.Length())
	for i := 0; i < s.Length(); i++ {
		value, _ := s.array.Get(i)
		str += fmt.Sprintf("%v ", value)
	}
	str = strings.TrimRight(str, " ")
	str += "]"
	return str
}

func NewStack() *Stack {
	return &Stack{array: array.NewArray()}
}

func (s *Stack) Length() int {
	return s.array.Length()
}

func (s *Stack) IsEmpty() bool {
	return s.array.IsEmpty()
}

func (s *Stack) Push(e model.Comparable) error {
	return s.array.AddLast(e)
}

func (s *Stack) Pop() (model.Comparable, error) {
	return s.array.RemoveLast()
}

func (s *Stack) Peek() (model.Comparable, error) {
	return s.array.GetLast()
}

2.1. 测试

func TestStack(t *testing.T) {
	stack := NewStack()
	fmt.Println(stack)

	e1 := model.NewElement(1)
	e2 := model.NewElement(2)
	e3 := model.NewElement(3)
	stack.Push(e1)
	stack.Push(e2)
	stack.Push(e3)
	fmt.Println(stack)

	fmt.Println(stack.Pop())
	fmt.Println(stack.Pop())

	fmt.Println(stack.Peek())
	fmt.Println(stack)
}