手写Golang泛型栈和队列的库函数
代码获取:
go get -u github.com/xzhHas/tools@latest
栈和队列我分别使用了切片和list实现,具体性能是切片比较高。
以下是压测案例:
代码测试:
package main
import (
"fmt"
"github.com/xzhHas/tools/queue"
"github.com/xzhHas/tools/stack"
"testing"
)
type CustomStruct struct {
ID int
Name string
Age int
Sex bool
Data []byte
}
func BenchmarkStackAndQueue(b *testing.B) {
// 测试 int 类型
b.Run("TestIntStack", func(b *testing.B) {
s1 := stack.NewStackArray[int]()
b.ResetTimer() // 重置计时器,防止初始化时间被计算进来
for i := 0; i < 100000; i++ {
s1.Push(i)
}
// 测试栈顶元素
for i := 0; i < 100000; i++ {
_, _ = s1.Peek() // 获取栈顶元素
}
for i := 0; i < 100000; i++ {
_, _ = s1.Pop()
}
})
b.Run("TestIntStackList", func(b *testing.B) {
s2 := stack.NewStackList[int]()
b.ResetTimer()
for i := 0; i < 100000; i++ {
s2.Push(i)
}
// 测试栈顶元素
for i := 0; i < 100000; i++ {
_, _ = s2.Peek() // 获取栈顶元素
}
for i := 0; i < 100000; i++ {
_, _ = s2.Pop()
}
})
b.Run("TestIntQueueArray", func(b *testing.B) {
q4 := queue.NewQueueArray[int]()
b.ResetTimer()
for i := 0; i < 100000; i++ {
q4.Enqueue(i)
}
// 测试队列头尾元素
for i := 0; i < 100000; i++ {
_, _ = q4.Front() // 获取队列头部元素
_, _ = q4.Back() // 获取队列尾部元素
}
for i := 0; i < 100000; i++ {
_, _ = q4.Dequeue()
}
})
b.Run("TestIntQueueList", func(b *testing.B) {
q3 := queue.NewQueueList[int]()
b.ResetTimer()
for i := 0; i < 100000; i++ {
q3.Enqueue(i)
}
// 测试队列头尾元素
for i := 0; i < 100000; i++ {
_, _ = q3.Front() // 获取队列头部元素
_, _ = q3.Back() // 获取队列尾部元素
}
for i := 0; i < 100000; i++ {
_, _ = q3.Dequeue()
}
})
// 测试 string 类型
b.Run("TestStringStack", func(b *testing.B) {
s1 := stack.NewStackArray[string]()
b.ResetTimer()
for i := 0; i < 100000; i++ {
s1.Push(fmt.Sprintf("string-%d", i))
}
// 测试栈顶元素
for i := 0; i < 100000; i++ {
_, _ = s1.Peek() // 获取栈顶元素
}
for i := 0; i < 100000; i++ {
_, _ = s1.Pop()
}
})
b.Run("TestStringStackList", func(b *testing.B) {
s2 := stack.NewStackList[string]()
b.ResetTimer()
for i := 0; i < 100000; i++ {
s2.Push(fmt.Sprintf("string-%d", i))
}
// 测试栈顶元素
for i := 0; i < 100000; i++ {
_, _ = s2.Peek() // 获取栈顶元素
}
for i := 0; i < 100000; i++ {
_, _ = s2.Pop()
}
})
b.Run("TestStringQueueArray", func(b *testing.B) {
q4 := queue.NewQueueArray[string]()
b.ResetTimer()
for i := 0; i < 100000; i++ {
q4.Enqueue(fmt.Sprintf("string-%d", i))
}
// 测试队列头尾元素
for i := 0; i < 100000; i++ {
_, _ = q4.Front() // 获取队列头部元素
_, _ = q4.Back() // 获取队列尾部元素
}
for i := 0; i < 100000; i++ {
_, _ = q4.Dequeue()
}
})
b.Run("TestStringQueueList", func(b *testing.B) {
q3 := queue.NewQueueList[string]()
b.ResetTimer()
for i := 0; i < 100000; i++ {
q3.Enqueue(fmt.Sprintf("string-%d", i))
}
// 测试队列头尾元素
for i := 0; i < 100000; i++ {
_, _ = q3.Front() // 获取队列头部元素
_, _ = q3.Back() // 获取队列尾部元素
}
for i := 0; i < 100000; i++ {
_, _ = q3.Dequeue()
}
})
// 测试自定义结构体类型
b.Run("TestCustomStructStack", func(b *testing.B) {
s1 := stack.NewStackArray[CustomStruct]()
b.ResetTimer()
for i := 0; i < 100000; i++ {
s1.Push(CustomStruct{ID: i, Name: fmt.Sprintf("custom-%d", i)})
}
// 测试栈顶元素
for i := 0; i < 100000; i++ {
_, _ = s1.Peek() // 获取栈顶元素
}
for i := 0; i < 100000; i++ {
_, _ = s1.Pop()
}
})
b.Run("TestCustomStructStackList", func(b *testing.B) {
s2 := stack.NewStackList[CustomStruct]()
b.ResetTimer()
for i := 0; i < 100000; i++ {
s2.Push(CustomStruct{ID: i, Name: fmt.Sprintf("custom-%d", i)})
}
// 测试栈顶元素
for i := 0; i < 100000; i++ {
_, _ = s2.Peek() // 获取栈顶元素
}
for i := 0; i < 100000; i++ {
_, _ = s2.Pop()
}
})
b.Run("TestCustomStructQueueArray", func(b *testing.B) {
q4 := queue.NewQueueArray[CustomStruct]()
b.ResetTimer()
for i := 0; i < 100000; i++ {
q4.Enqueue(CustomStruct{ID: i, Name: fmt.Sprintf("custom-%d", i)})
}
// 测试队列头尾元素
for i := 0; i < 100000; i++ {
_, _ = q4.Front() // 获取队列头部元素
_, _ = q4.Back() // 获取队列尾部元素
}
for i := 0; i < 100000; i++ {
_, _ = q4.Dequeue()
}
})
b.Run("TestCustomStructQueueList", func(b *testing.B) {
q3 := queue.NewQueueList[CustomStruct]()
b.ResetTimer()
for i := 0; i < 100000; i++ {
q3.Enqueue(CustomStruct{ID: i, Name: fmt.Sprintf("custom-%d", i)})
}
// 测试队列头尾元素
for i := 0; i < 100000; i++ {
_, _ = q3.Front() // 获取队列头部元素
_, _ = q3.Back() // 获取队列尾部元素
}
for i := 0; i < 100000; i++ {
_, _ = q3.Dequeue()
}
})
}