数据结构-栈
栈的定义
栈(stack)是限定仅在表尾进行插入和删除操作的线性表,一种遵循先入后出逻辑的线性数据结构。
本文将使用go语言,从切片以及链表两种方式实现栈(推荐使用切片来模拟栈)。
栈的结构定义
go
// Stack 栈
type Stack []intgo
// Stack 栈
type Stack struct {
*list.List // 务必注意嵌入的是指针类型
}栈的初始化
go
// NewStack 创建一个栈
// Returns:
// - *Stack: 栈指针
func NewStack() *Stack {
return &Stack{}
}go
// NewStack 创建一个栈
// Return
// - *Stack 栈指针
func NewStack() *Stack {
return &Stack{List: list.New()}
}栈的常用操作
入栈
go
// push 入栈
// Params:
// - v: 入栈元素
func (s *Stack) push(v int) {
*s = append(*s, v) // 将v添加到切片的末尾
}go
// push 入栈
// Params:
// - v 入栈元素
func (s *Stack) push(v interface{}) {
s.List.PushBack(v)
}出栈
go
// pop 出栈
// Returns:
// - int: 出栈元素
func (s *Stack) pop() int {
if len(*s) == 0 {
return -1
}
v := (*s)[len(*s)-1] // 获取切片的最后一个元素
*s = (*s)[:len(*s)-1] // 切片截断,删除最后一个元素
return v
}go
// pop 出栈
// Return:
// - any 出栈元素
func (s *Stack) pop() any {
return s.List.Remove(s.Back())
}获取栈顶元素
go
// peek 获取栈顶元素
func (s *Stack) peek() int {
if len(*s) == 0 {
return -1
}
return (*s)[len(*s)-1]
}go
// peek 查看栈顶元素
// Return:
// - any 栈顶元素
func (s *Stack) peek() any {
return s.List.Back().Value
}判断栈是否为空
go
// isEmpty 判断栈是否为空
func (s *Stack) isEmpty() bool {
return len(*s) == 0
}go
// isEmpty 栈是否为空
// Return:
// - bool 是否为空
func (s *Stack) isEmpty() bool {
return s.List.Len() == 0
}获取栈的大小
go
// len 获取栈长度
func (s *Stack) len() int {
return len(*s)
}go
// len 栈大小
// Return:
// - int 栈大小
func (s *Stack) len() int {
return s.List.Len()
}测试函数示例代码
go
package slice
import (
"testing"
)
func TestSliceStack(t *testing.T) {
stack := NewStack()
stack.push(1)
stack.push(2)
stack.push(3)
t.Log("stack:", stack)
t.Log("pop:", stack.pop())
t.Log("stack:", stack)
t.Log("peek:", stack.peek())
t.Log("len:", stack.len())
t.Log("is empty:", stack.isEmpty())
}go
package linked_list
import "testing"
func TestLinkedListStack(t *testing.T) {
stack := NewStack()
stack.push(1)
stack.push(2)
stack.push(3)
t.Log("stack:")
stack.print()
t.Log("pop:", stack.pop())
t.Log("stack:")
stack.print()
t.Log("peek:", stack.peek())
t.Log("len:", stack.len())
t.Log("is empty:", stack.isEmpty())
}测试结果

