File tree Expand file tree Collapse file tree 3 files changed +168
-1
lines changed
Expand file tree Collapse file tree 3 files changed +168
-1
lines changed Original file line number Diff line number Diff line change 11package 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+ }
Original file line number Diff line number Diff line change 11package 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+ }
Original file line number Diff line number Diff line change 11package stack
2+
3+
You can’t perform that action at this time.
0 commit comments