目录

前言

始于此篇,为了学习 Golang 基础,采用了使用 Golang 实现各种数据结构,以此来和 Golang 交朋友,今天的主题就是 把Stack介绍给Golang认识

源码:Stack

介绍Stack

在计算机科学中,stack(栈)是一种基本的数据结构,它是一种线性结构,具有后进先出(Last In First Out)的特点。

stack

ChatGPTstack
  • Push
  • Pop
  • Peek
  • Len
  • Cap
  • Clear

那就开始吧!

Stack

struct
type Element interface{}

type Stack struct {
	elements []Element
	top   int // 栈顶指针
	cap      int // 容量
}

Push

作用:Push 方法就是往stack的存储区域压入新的元素

// Push
func (stack *Stack) Push(element Element) (err error) {
	// top == cap时,栈满
	if stack.top >= stack.cap {
		return errors.New("the stack is full")
	}
	stack.elements[stack.top] = element
	stack.top++
	return nil
}

Pop

作用:Pop 方法是取出栈顶元素,并且在存储区域内删除

// Pop
func (stack *Stack) Pop() (ele Element, err error){
	// top == 0时,栈空
	if stack.top <= 0 {
		return nil, errors.New("the stack is empty")
	}
	ele = stack.elements[stack.top]
	// 在栈中清除当前元素
	stack.elements = append(stack.elements, stack.elements[:stack.top], stack.elements[stack.top+1:])
	stack.top--
	return ele, nil
}

Peek

作用:Peek 方法就是返回栈顶的值,但是不删除存储区域的元素

// Peek
func (stack *Stack) Peek() (ele Element, err error){
	if stack.top <= 0 {
		return nil, errors.New("the stack is empty")
	}
	ele = stack.elements[stack.top]
	return ele, nil
}

Len & Cap & Clear

  • Len:返回栈的存储的元素个数
  • Cap:当前栈的容量
  • Clear:将栈清空
// Len
func (stack *Stack) Len() int{
	return stack.top
}

// Cap
func (stack *Stack) Cap() int{
	return stack.cap
}

// Clear
func (stack *Stack) Clear() {
	if stack.top <= 0 {
		return
	}
	// 重新分配一个空切片
	stack.elements = stack.elements[:0]
	stack.top = 0
}
NewStack

NewStack

// 初始化栈
func NewStack(cap int) *Stack {
	elements := make([]Element, cap)
	return &Stack{
		elements: elements,
		top:   0,
		cap:      cap,
	}
}

使用

package main

import "fmt"

func main() {
	stack := NewStack(5)
	for i := 0; i < 4; i++ {
		var ele Element = i
		stack.Push(ele)
	}

	element, _ := stack.Pop()
	fmt.Println(element)

	peekEle, _ := stack.Peek()
	fmt.Println(peekEle)

	fmt.Println(stack.Len())
	fmt.Println(stack.Cap())

	stack.Clear()
}
您可能感兴趣的文章: