数据结构:栈(Stack)

412 阅读1分钟

栈,后进先出(先进后出),常用数据结构之一。有两种实现形式:顺序存储和链式存储。
深度优先遍历可以基于该数据结构做模拟操作。

刷题常用。

实现一,基于go标准库的container/list

import "container/list"

type Stack struct {
	l *list.List
}

func NewStack() *Stack {
	return &Stack{
		l: list.New(),
	}
}

func (o *Stack) Push(v interface{}) {
	o.l.PushBack(v)
}

func (o *Stack) Peek() interface{} {
	if o.IsEmpty() {
		panic("Stack is empty")
	}
	return o.l.Back().Value
}

func (o *Stack) Pop() {
	if o.IsEmpty() {
		panic("Stack is empty")
	}
	o.l.Remove(o.l.Back())
}

func (o *Stack) IsEmpty() bool {
	return o.l.Len() == 0
}

func (o *Stack) Len() int {
	return o.l.Len()
}

实现二,基于slice

type Stack struct {
	data []interface{}
}

func NewStack() *Stack {
	return &Stack{}
}

func (o *Stack) Push(v interface{}) {
	o.data = append(o.data, v)
}

func (o *Stack) Peek() interface{} {
	if o.IsEmpty() {
		panic("Stack is empty")
	}
	return o.data[len(o.data)-1]
}

func (o *Stack) Pop() {
	if o.IsEmpty() {
		panic("Stack is empty")
	}
	o.data = o.data[:len(o.data)-1]
}

func (o *Stack) Len() int {
	return len(o.data)
}

func (o *Stack) IsEmpty() bool {
	return len(o.data) == 0
}

实现三,基于单链表

// 单链表的package
import "algo/internal/singlylinkedlist"

type Stack struct {
	list *singlylinkedlist.SinglyLinkedList
	size int
}

func NewStack() *Stack {
	return &Stack{
		list: &singlylinkedlist.SinglyLinkedList{},
	}
}

func (o *Stack) Len() int {
	return o.size
}

func (o *Stack) IsEmpty() bool {
	return o.size == 0
}

func (o *Stack) Push(v interface{}) {
	o.list.AddToHead(v)
	o.size++
}

func (o *Stack) Peek() interface{} {
	if o.IsEmpty() {
		panic("Stack is empty")
	}
	return o.list.Head().V
}

func (o *Stack) Pop() {
	if o.IsEmpty() {
		panic("Stack is empty")
	}
	o.list.RemoveHead()
	o.size--
}

测试代码:

package main

import "fmt"

func main() {
	sk := NewStack()
	for i := 0; i < 9; i++ {
		sk.Push(i * 2)
	}
	for !sk.IsEmpty() {
		fmt.Println(sk.Peek().(int), sk.Len())
		sk.Pop()
	}
}