Skip to content

Commit f4c8adb

Browse files
committed
feat: impl min stack & max stack & sync
1 parent fcfbc7d commit f4c8adb

File tree

5 files changed

+389
-0
lines changed

5 files changed

+389
-0
lines changed

comparator.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package stack
2+
3+
type Comparator[T any] func(a T, b T) int

stack_max.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,109 @@
11
package stack
22

3+
type MaxStack[T any] struct {
4+
comparator Comparator[T]
5+
stack Stack[*MaxNode[T]]
6+
}
37

8+
var _ Stack[any] = &MaxStack[any]{}
9+
10+
func NewMaxStack[T any](comparator Comparator[T]) *MaxStack[T] {
11+
return &MaxStack[T]{
12+
comparator: comparator,
13+
stack: NewArrayStack[*MaxNode[T]](),
14+
}
15+
}
16+
17+
func (x *MaxStack[T]) Push(values ...T) error {
18+
for _, value := range values {
19+
node := &MaxNode[T]{
20+
value: value,
21+
}
22+
topNode, err := x.stack.PeekE()
23+
if err != nil {
24+
// 栈为空,认为最大值是自己
25+
node.max = value
26+
} else if x.comparator(topNode.max, value) > 0 {
27+
// 当前栈顶的元素比较小
28+
node.max = topNode.max
29+
} else {
30+
node.max = value
31+
}
32+
if err := x.stack.Push(node); err != nil {
33+
return err
34+
}
35+
}
36+
return nil
37+
}
38+
39+
func (x *MaxStack[T]) Pop() T {
40+
e, _ := x.PopE()
41+
return e
42+
}
43+
44+
func (x *MaxStack[T]) PopE() (T, error) {
45+
e, err := x.stack.PopE()
46+
if err != nil {
47+
return nil, err
48+
}
49+
return e.value, nil
50+
}
51+
52+
func (x *MaxStack[T]) Peek() T {
53+
e, _ := x.PeekE()
54+
return e
55+
}
56+
57+
func (x *MaxStack[T]) PeekE() (T, error) {
58+
e, err := x.stack.PeekE()
59+
if err != nil {
60+
return nil, err
61+
}
62+
return e.value, nil
63+
}
64+
65+
func (x *MaxStack[T]) IsEmpty() bool {
66+
return x.stack.IsEmpty()
67+
}
68+
69+
func (x *MaxStack[T]) IsNotEmpty() bool {
70+
return x.stack.IsNotEmpty()
71+
}
72+
73+
func (x *MaxStack[T]) Len() int {
74+
return x.stack.Len()
75+
}
76+
77+
func (x *MaxStack[T]) Clear() error {
78+
return x.stack.Clear()
79+
}
80+
81+
func (x *MaxStack[T]) String() string {
82+
return x.stack.String()
83+
}
84+
85+
func (x *MaxStack[T]) GetMax() T {
86+
e, _ := x.GetMaxE()
87+
return e
88+
}
89+
90+
func (x *MaxStack[T]) GetMaxE() (T, error) {
91+
e, err := x.stack.PeekE()
92+
if err != nil {
93+
return nil, err
94+
}
95+
return e.max, nil
96+
}
97+
98+
// ------------------------------------------------ ---------------------------------------------------------------------
99+
100+
type MaxNode[T any] struct {
101+
102+
// 栈的当前位置的值
103+
value T
104+
105+
// 栈底到当前位置的最大值
106+
max T
107+
}
108+
109+
// ------------------------------------------------ ---------------------------------------------------------------------

stack_max_sync.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,90 @@
11
package stack
2+
3+
import "sync"
4+
5+
type SyncMaxStack[T any] struct {
6+
stack *MaxStack[T]
7+
lock sync.RWMutex
8+
}
9+
10+
var _ Stack[any] = &SyncMaxStack[any]{}
11+
12+
func NewSyncMaxStack[T any](comparator Comparator[T]) *SyncMaxStack[T] {
13+
return &SyncMaxStack[T]{
14+
stack: NewMaxStack[T](comparator),
15+
lock: sync.RWMutex{},
16+
}
17+
}
18+
19+
func (x *SyncMaxStack[T]) Push(values ...T) error {
20+
x.lock.Lock()
21+
defer x.lock.Unlock()
22+
return x.stack.Push(values...)
23+
}
24+
25+
func (x *SyncMaxStack[T]) Pop() T {
26+
x.lock.Lock()
27+
defer x.lock.Unlock()
28+
return x.stack.Pop()
29+
}
30+
31+
func (x *SyncMaxStack[T]) PopE() (T, error) {
32+
x.lock.Lock()
33+
defer x.lock.Unlock()
34+
return x.stack.PopE()
35+
}
36+
37+
func (x *SyncMaxStack[T]) Peek() T {
38+
x.lock.RLock()
39+
defer x.lock.RLock()
40+
return x.stack.Peek()
41+
}
42+
43+
func (x *SyncMaxStack[T]) PeekE() (T, error) {
44+
x.lock.RLock()
45+
defer x.lock.RLock()
46+
return x.stack.PeekE()
47+
}
48+
49+
func (x *SyncMaxStack[T]) IsEmpty() bool {
50+
x.lock.RLock()
51+
defer x.lock.RLock()
52+
return x.stack.IsEmpty()
53+
}
54+
55+
func (x *SyncMaxStack[T]) IsNotEmpty() bool {
56+
x.lock.RLock()
57+
defer x.lock.RLock()
58+
return x.stack.IsNotEmpty()
59+
}
60+
61+
func (x *SyncMaxStack[T]) Len() int {
62+
x.lock.RLock()
63+
defer x.lock.RLock()
64+
return x.stack.Len()
65+
}
66+
67+
func (x *SyncMaxStack[T]) Clear() error {
68+
x.lock.Lock()
69+
defer x.lock.Unlock()
70+
return x.stack.Clear()
71+
}
72+
73+
func (x *SyncMaxStack[T]) String() string {
74+
x.lock.RLock()
75+
defer x.lock.RLock()
76+
return x.stack.String()
77+
}
78+
79+
80+
func (x *SyncMaxStack[T]) GetMax() T {
81+
x.lock.RLock()
82+
defer x.lock.RLock()
83+
return x.stack.GetMax()
84+
}
85+
86+
func (x *SyncMaxStack[T]) GetMaxE() (T, error) {
87+
x.lock.RLock()
88+
defer x.lock.RLock()
89+
return x.stack.GetMaxE()
90+
}

stack_min.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,109 @@
11
package stack
22

3+
type MinStack[T any] struct {
4+
comparator Comparator[T]
5+
stack Stack[*MinNode[T]]
6+
}
37

8+
var _ Stack[any] = &MinStack[any]{}
9+
10+
func NewMinStack[T any](comparator Comparator[T]) *MinStack[T] {
11+
return &MinStack[T]{
12+
comparator: comparator,
13+
stack: NewArrayStack[*MinNode[T]](),
14+
}
15+
}
16+
17+
func (x *MinStack[T]) Push(values ...T) error {
18+
for _, value := range values {
19+
node := &MinNode[T]{
20+
value: value,
21+
}
22+
topNode, err := x.stack.PeekE()
23+
if err != nil {
24+
// 栈为空,认为最小值是自己
25+
node.min = value
26+
} else if x.comparator(topNode.min, value) < 0 {
27+
// 当前栈顶的元素比较小
28+
node.min = topNode.min
29+
} else {
30+
node.min = value
31+
}
32+
if err := x.stack.Push(node); err != nil {
33+
return err
34+
}
35+
}
36+
return nil
37+
}
38+
39+
func (x *MinStack[T]) Pop() T {
40+
e, _ := x.PopE()
41+
return e
42+
}
43+
44+
func (x *MinStack[T]) PopE() (T, error) {
45+
e, err := x.stack.PopE()
46+
if err != nil {
47+
return nil, err
48+
}
49+
return e.value, nil
50+
}
51+
52+
func (x *MinStack[T]) Peek() T {
53+
e, _ := x.PeekE()
54+
return e
55+
}
56+
57+
func (x *MinStack[T]) PeekE() (T, error) {
58+
e, err := x.stack.PeekE()
59+
if err != nil {
60+
return nil, err
61+
}
62+
return e.value, nil
63+
}
64+
65+
func (x *MinStack[T]) IsEmpty() bool {
66+
return x.stack.IsEmpty()
67+
}
68+
69+
func (x *MinStack[T]) IsNotEmpty() bool {
70+
return x.stack.IsNotEmpty()
71+
}
72+
73+
func (x *MinStack[T]) Len() int {
74+
return x.stack.Len()
75+
}
76+
77+
func (x *MinStack[T]) Clear() error {
78+
return x.stack.Clear()
79+
}
80+
81+
func (x *MinStack[T]) String() string {
82+
return x.stack.String()
83+
}
84+
85+
func (x *MinStack[T]) GetMin() T {
86+
e, _ := x.GetMinE()
87+
return e
88+
}
89+
90+
func (x *MinStack[T]) GetMinE() (T, error) {
91+
e, err := x.stack.PeekE()
92+
if err != nil {
93+
return nil, err
94+
}
95+
return e.min, nil
96+
}
97+
98+
// ------------------------------------------------ ---------------------------------------------------------------------
99+
100+
type MinNode[T any] struct {
101+
102+
// 栈的当前位置的值
103+
value T
104+
105+
// 栈底到当前位置的最小值
106+
min T
107+
}
108+
109+
// ------------------------------------------------ ---------------------------------------------------------------------

0 commit comments

Comments
 (0)