Skip to content

Commit fcfbc7d

Browse files
committed
feat: impl LinkedStack & SyncLinkedStack
1 parent 5232979 commit fcfbc7d

File tree

3 files changed

+168
-1
lines changed

3 files changed

+168
-1
lines changed

stack_linked.go

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,92 @@
11
package stack
22

3-
type LinkedStack[T any] struct{}
3+
type LinkedStack[T any] struct {
4+
top *Node[T]
5+
}
6+
7+
var _ Stack[any] = &LinkedStack[any]{}
8+
9+
func NewLinkedStack[T any]() *LinkedStack[T] {
10+
return &LinkedStack[T]{}
11+
}
12+
13+
func (x *LinkedStack[T]) Push(values ...T) error {
14+
for _, value := range values {
15+
node := &Node[T]{
16+
value: value,
17+
}
18+
// 此时栈为空
19+
if x.top == nil {
20+
x.top = node
21+
} else {
22+
// 将新的节点指向栈顶,同时把栈顶指针往上移动
23+
node.next = x.top
24+
x.top = node
25+
}
26+
}
27+
return nil
28+
}
29+
30+
func (x *LinkedStack[T]) Pop() T {
31+
e, _ := x.PopE()
32+
return e
33+
}
34+
35+
func (x *LinkedStack[T]) PopE() (T, error) {
36+
if x.top == nil {
37+
return nil, ErrStackEmpty
38+
}
39+
top := x.top
40+
x.top = x.top.next
41+
top.next = nil
42+
top.value = nil
43+
value := top.value
44+
return value, nil
45+
}
46+
47+
func (x *LinkedStack[T]) Peek() T {
48+
e, _ := x.PeekE()
49+
return e
50+
}
51+
52+
func (x *LinkedStack[T]) PeekE() (T, error) {
53+
if x.top == nil {
54+
return nil, ErrStackEmpty
55+
}
56+
return x.top.value, nil
57+
}
58+
59+
func (x *LinkedStack[T]) IsEmpty() bool {
60+
return x.top == nil
61+
}
62+
63+
func (x *LinkedStack[T]) IsNotEmpty() bool {
64+
return x.top != nil
65+
}
66+
67+
func (x *LinkedStack[T]) Len() int {
68+
count := 0
69+
node := x.top
70+
for node != nil {
71+
count++
72+
node = node.next
73+
}
74+
return count
75+
}
76+
77+
func (x *LinkedStack[T]) Clear() error {
78+
x.top = nil
79+
return nil
80+
}
81+
82+
func (x *LinkedStack[T]) String() string {
83+
//TODO implement me
84+
panic("implement me")
85+
}
86+
87+
// ---------------------------------------------------------------------------------------------------------------------
88+
89+
type Node[T any] struct {
90+
value T
91+
next *Node[T]
92+
}

stack_linked_sync.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,77 @@
11
package stack
2+
3+
import "sync"
4+
5+
type SyncLinkedStack[T any] struct {
6+
stack *LinkedStack[T]
7+
lock sync.RWMutex
8+
}
9+
10+
var _ Stack[any] = &SyncLinkedStack[any]{}
11+
12+
func NewSyncLinkedStack[T any]() *SyncLinkedStack[T] {
13+
return &SyncLinkedStack[T]{
14+
stack: NewLinkedStack[T](),
15+
lock: sync.RWMutex{},
16+
}
17+
}
18+
19+
func (x *SyncLinkedStack[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 *SyncLinkedStack[T]) Pop() T {
26+
x.lock.Lock()
27+
defer x.lock.Unlock()
28+
return x.stack.Pop()
29+
}
30+
31+
func (x *SyncLinkedStack[T]) PopE() (T, error) {
32+
x.lock.Lock()
33+
defer x.lock.Unlock()
34+
return x.stack.PopE()
35+
}
36+
37+
func (x *SyncLinkedStack[T]) Peek() T {
38+
x.lock.RLock()
39+
defer x.lock.RLock()
40+
return x.stack.Peek()
41+
}
42+
43+
func (x *SyncLinkedStack[T]) PeekE() (T, error) {
44+
x.lock.RLock()
45+
defer x.lock.RLock()
46+
return x.stack.PeekE()
47+
}
48+
49+
func (x *SyncLinkedStack[T]) IsEmpty() bool {
50+
x.lock.RLock()
51+
defer x.lock.RLock()
52+
return x.stack.IsEmpty()
53+
}
54+
55+
func (x *SyncLinkedStack[T]) IsNotEmpty() bool {
56+
x.lock.RLock()
57+
defer x.lock.RLock()
58+
return x.stack.IsNotEmpty()
59+
}
60+
61+
func (x *SyncLinkedStack[T]) Len() int {
62+
x.lock.RLock()
63+
defer x.lock.RLock()
64+
return x.stack.Len()
65+
}
66+
67+
func (x *SyncLinkedStack[T]) Clear() error {
68+
x.lock.Lock()
69+
defer x.lock.Unlock()
70+
return x.stack.Clear()
71+
}
72+
73+
func (x *SyncLinkedStack[T]) String() string {
74+
x.lock.RLock()
75+
defer x.lock.RLock()
76+
return x.stack.String()
77+
}

stack_min.go

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

0 commit comments

Comments
 (0)