-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlinked_stack.go
120 lines (96 loc) · 2.2 KB
/
linked_stack.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package stacks
import (
"fmt"
"strings"
)
// LinkedStack 基于链表实现的栈
type LinkedStack[T any] struct {
// 始终指向栈顶的节点
top *Node[T]
// 栈中元素的个数,为了实现O(1)计算栈大小
elementCount int
}
var _ Stack[any] = &LinkedStack[any]{}
func NewLinkedStack[T any]() *LinkedStack[T] {
return &LinkedStack[T]{}
}
func (x *LinkedStack[T]) Push(values ...T) {
for _, value := range values {
node := &Node[T]{
value: value,
}
// 此时栈为空
if x.top == nil {
// 直接把栈顶指针指向新的节点就可以了
x.top = node
} else {
// 如果栈不为空,将新的节点的next指向栈顶
node.next = x.top
// 同时把栈顶指针往上移动,指向这个新的节点
x.top = node
}
// 栈中元素个数加1
x.elementCount++
}
}
func (x *LinkedStack[T]) Pop() T {
element, _ := x.PopE()
return element
}
func (x *LinkedStack[T]) PopE() (T, error) {
if x.top == nil {
var zero T
return zero, ErrStackEmpty
}
top := x.top
x.top = x.top.next
value := top.value
top.next = nil
var zero T
top.value = zero
x.elementCount--
return value, nil
}
func (x *LinkedStack[T]) Peek() T {
element, _ := x.PeekE()
return element
}
func (x *LinkedStack[T]) PeekE() (T, error) {
if x.top == nil {
var zero T
return zero, ErrStackEmpty
}
return x.top.value, nil
}
func (x *LinkedStack[T]) IsEmpty() bool {
return x.top == nil
}
func (x *LinkedStack[T]) IsNotEmpty() bool {
return x.top != nil
}
func (x *LinkedStack[T]) Size() int {
return x.elementCount
}
func (x *LinkedStack[T]) Clear() {
x.top = nil
x.elementCount = 0
}
func (x *LinkedStack[T]) String() string {
sb := strings.Builder{}
sb.WriteString("[")
currentNode := x.top
for currentNode != nil {
sb.WriteString(fmt.Sprintf("%#v", currentNode.value))
currentNode = currentNode.next
}
sb.WriteString("]")
return sb.String()
}
// ---------------------------------------------------------------------------------------------------------------------
// Node 用于持有栈中元素的节点
type Node[T any] struct {
// 持有的节点
value T
// 指向往栈底的下一个节点的,如果为空的话表示当前节点就是栈底了
next *Node[T]
}