Skip to content

Commit b1b88e8

Browse files
committed
refactor stack interface
1 parent 7b15a08 commit b1b88e8

12 files changed

+198
-55
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ go get github.com/CC11001100/go-stack
4949
## 入栈
5050

5151
```
52-
Push(values ...T) error
52+
Push(values ...T)
5353
```
5454

5555

@@ -92,7 +92,7 @@ Size() int
9292
## 清空栈
9393

9494
```
95-
Clear() error
95+
Clear()
9696
```
9797

9898

array_stack.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func NewArrayStack[T any]() *ArrayStack[T] {
2121
}
2222
}
2323

24-
func (x *ArrayStack[T]) Push(values ...T) error {
24+
func (x *ArrayStack[T]) Push(values ...T) {
2525
for _, value := range values {
2626
if x.topIndex < len(x.slice) {
2727
x.slice[x.topIndex] = value
@@ -30,7 +30,6 @@ func (x *ArrayStack[T]) Push(values ...T) error {
3030
}
3131
x.topIndex++
3232
}
33-
return nil
3433
}
3534

3635
func (x *ArrayStack[T]) Pop() T {
@@ -73,10 +72,9 @@ func (x *ArrayStack[T]) Size() int {
7372
return x.topIndex
7473
}
7574

76-
func (x *ArrayStack[T]) Clear() error {
75+
func (x *ArrayStack[T]) Clear() {
7776
x.topIndex = 0
7877
x.slice = make([]T, 0)
79-
return nil
8078
}
8179

8280
func (x *ArrayStack[T]) String() string {

array_stack_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,115 @@
11
package stack
22

33
import (
4+
"fmt"
45
"github.com/stretchr/testify/assert"
56
"testing"
67
)
78

9+
// ------------------------------------------------ ---------------------------------------------------------------------
10+
811
func TestArrayStack_Clear(t *testing.T) {
912
stack := NewArrayStack[int]()
1013
stack.Push(1)
1114
stack.Push(2)
1215
assert.Equal(t, 2, stack.Size())
16+
stack.Clear()
17+
assert.Equal(t, 0, stack.Size())
18+
}
1319

20+
func ExampleArrayStack_Clear() {
21+
stack := NewArrayStack[int]()
22+
stack.Push(1)
23+
stack.Push(2)
24+
fmt.Println(stack.Size())
25+
stack.Clear()
26+
fmt.Println(stack.Size())
27+
// Output:
28+
// 2
29+
// 0
1430
}
1531

32+
// ------------------------------------------------ ---------------------------------------------------------------------
33+
1634
func TestArrayStack_IsEmpty(t *testing.T) {
35+
stack := NewArrayStack[int]()
36+
assert.Equal(t, stack.IsEmpty(), true)
37+
stack.Push(1)
38+
assert.Equal(t, stack.IsEmpty(), false)
39+
}
1740

41+
func ExampleArrayStack_IsEmpty() {
42+
stack := NewArrayStack[int]()
43+
fmt.Println(stack.IsEmpty())
44+
stack.Push(1)
45+
fmt.Println(stack.IsEmpty())
46+
// Output:
47+
// true
48+
// false
1849
}
1950

51+
// ------------------------------------------------ ---------------------------------------------------------------------
52+
2053
func TestArrayStack_IsNotEmpty(t *testing.T) {
54+
stack := NewArrayStack[int]()
55+
assert.Equal(t, stack.IsNotEmpty(), false)
56+
stack.Push(1)
57+
assert.Equal(t, stack.IsEmpty(), true)
58+
}
2159

60+
func ExampleArrayStack_IsNotEmpty() {
61+
stack := NewArrayStack[int]()
62+
fmt.Println(stack.IsNotEmpty())
63+
stack.Push(1)
64+
fmt.Println(stack.IsNotEmpty())
2265
}
2366

67+
// ------------------------------------------------ ---------------------------------------------------------------------
68+
2469
func TestArrayStack_Size(t *testing.T) {
2570

2671
}
2772

73+
// ------------------------------------------------ ---------------------------------------------------------------------
74+
2875
func TestArrayStack_Peek(t *testing.T) {
2976

3077
}
3178

79+
// ------------------------------------------------ ---------------------------------------------------------------------
80+
3281
func TestArrayStack_PeekE(t *testing.T) {
3382

3483
}
3584

85+
// ------------------------------------------------ ---------------------------------------------------------------------
86+
3687
func TestArrayStack_Pop(t *testing.T) {
3788

3889
}
3990

91+
// ------------------------------------------------ ---------------------------------------------------------------------
92+
4093
func TestArrayStack_PopE(t *testing.T) {
4194

4295
}
4396

97+
// ------------------------------------------------ ---------------------------------------------------------------------
98+
4499
func TestArrayStack_Push(t *testing.T) {
45100

46101
}
47102

103+
// ------------------------------------------------ ---------------------------------------------------------------------
104+
48105
func TestArrayStack_String(t *testing.T) {
49106

50107
}
51108

109+
// ------------------------------------------------ ---------------------------------------------------------------------
110+
52111
func TestNewArrayStack(t *testing.T) {
53112

54113
}
114+
115+
// ------------------------------------------------ ---------------------------------------------------------------------

linked_stack.go

Lines changed: 44 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,18 @@
11
package stack
22

3+
import (
4+
"fmt"
5+
"strings"
6+
)
7+
8+
// LinkedStack 基于链表实现的栈
39
type LinkedStack[T any] struct {
10+
11+
// 始终指向栈顶的节点
412
top *Node[T]
5-
ln int
13+
14+
// 栈中元素的个数,为了实现O(1)计算栈大小
15+
elementCount int
616
}
717

818
var _ Stack[any] = &LinkedStack[any]{}
@@ -11,47 +21,53 @@ func NewLinkedStack[T any]() *LinkedStack[T] {
1121
return &LinkedStack[T]{}
1222
}
1323

14-
func (x *LinkedStack[T]) Push(values ...T) error {
24+
func (x *LinkedStack[T]) Push(values ...T) {
1525
for _, value := range values {
1626
node := &Node[T]{
1727
value: value,
1828
}
1929
// 此时栈为空
2030
if x.top == nil {
31+
// 直接把栈顶指针指向新的节点就可以了
2132
x.top = node
2233
} else {
23-
// 将新的节点指向栈顶,同时把栈顶指针往上移动
34+
// 如果栈不为空,将新的节点的next指向栈顶
2435
node.next = x.top
36+
// 同时把栈顶指针往上移动,指向这个新的节点
2537
x.top = node
2638
}
27-
x.ln++
39+
// 栈中元素个数加1
40+
x.elementCount++
2841
}
29-
return nil
3042
}
3143

3244
func (x *LinkedStack[T]) Pop() T {
33-
e, _ := x.PopE()
34-
return e
45+
element, _ := x.PopE()
46+
return element
3547
}
3648

3749
func (x *LinkedStack[T]) PopE() (T, error) {
3850
if x.top == nil {
3951
var zero T
4052
return zero, ErrStackEmpty
4153
}
54+
4255
top := x.top
4356
x.top = x.top.next
4457
value := top.value
58+
4559
top.next = nil
4660
var zero T
4761
top.value = zero
48-
x.ln--
62+
63+
x.elementCount--
64+
4965
return value, nil
5066
}
5167

5268
func (x *LinkedStack[T]) Peek() T {
53-
e, _ := x.PeekE()
54-
return e
69+
element, _ := x.PeekE()
70+
return element
5571
}
5672

5773
func (x *LinkedStack[T]) PeekE() (T, error) {
@@ -71,23 +87,34 @@ func (x *LinkedStack[T]) IsNotEmpty() bool {
7187
}
7288

7389
func (x *LinkedStack[T]) Size() int {
74-
return x.ln
90+
return x.elementCount
7591
}
7692

77-
func (x *LinkedStack[T]) Clear() error {
93+
func (x *LinkedStack[T]) Clear() {
7894
x.top = nil
79-
x.ln = 0
80-
return nil
95+
x.elementCount = 0
8196
}
8297

8398
func (x *LinkedStack[T]) String() string {
84-
//TODO implement me
85-
panic("implement me")
99+
sb := strings.Builder{}
100+
sb.WriteString("[")
101+
currentNode := x.top
102+
for currentNode != nil {
103+
sb.WriteString(fmt.Sprintf("%#v", currentNode.value))
104+
currentNode = currentNode.next
105+
}
106+
sb.WriteString("]")
107+
return sb.String()
86108
}
87109

88110
// ---------------------------------------------------------------------------------------------------------------------
89111

112+
// Node 用于持有栈中元素的节点
90113
type Node[T any] struct {
114+
115+
// 持有的节点
91116
value T
92-
next *Node[T]
117+
118+
// 指向往栈底的下一个节点的,如果为空的话表示当前节点就是栈底了
119+
next *Node[T]
93120
}

linked_stack_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package stack
2+
3+
import (
4+
"fmt"
5+
"github.com/stretchr/testify/assert"
6+
"testing"
7+
)
8+
9+
func TestLinkedStack_Clear(t *testing.T) {
10+
11+
}
12+
13+
func TestLinkedStack_IsEmpty(t *testing.T) {
14+
15+
}
16+
17+
func TestLinkedStack_IsNotEmpty(t *testing.T) {
18+
19+
}
20+
21+
func TestLinkedStack_Peek(t *testing.T) {
22+
23+
}
24+
25+
func TestLinkedStack_PeekE(t *testing.T) {
26+
27+
}
28+
29+
func TestLinkedStack_Pop(t *testing.T) {
30+
31+
}
32+
33+
func TestLinkedStack_PopE(t *testing.T) {
34+
35+
}
36+
37+
func TestLinkedStack_Push(t *testing.T) {
38+
39+
}
40+
41+
func TestLinkedStack_Size(t *testing.T) {
42+
43+
}
44+
45+
func TestLinkedStack_String(t *testing.T) {
46+
47+
}
48+
49+
// ------------------------------------------------ ---------------------------------------------------------------------
50+
51+
func TestNewLinkedStack(t *testing.T) {
52+
stack := NewLinkedStack[int]()
53+
assert.NotNil(t, stack)
54+
}
55+
56+
func ExampleNewLinkedStack() {
57+
stack := NewLinkedStack[int]()
58+
fmt.Println(stack.String())
59+
// Output:
60+
// []
61+
}
62+
63+
// ------------------------------------------------ ---------------------------------------------------------------------

max_stack.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func NewMaxStack[T any](comparator Comparator[T]) *MaxStack[T] {
1414
}
1515
}
1616

17-
func (x *MaxStack[T]) Push(values ...T) error {
17+
func (x *MaxStack[T]) Push(values ...T) {
1818
for _, value := range values {
1919
node := &MaxNode[T]{
2020
value: value,
@@ -29,11 +29,8 @@ func (x *MaxStack[T]) Push(values ...T) error {
2929
} else {
3030
node.max = value
3131
}
32-
if err := x.stack.Push(node); err != nil {
33-
return err
34-
}
32+
x.stack.Push(node)
3533
}
36-
return nil
3734
}
3835

3936
func (x *MaxStack[T]) Pop() T {
@@ -76,8 +73,8 @@ func (x *MaxStack[T]) Size() int {
7673
return x.stack.Size()
7774
}
7875

79-
func (x *MaxStack[T]) Clear() error {
80-
return x.stack.Clear()
76+
func (x *MaxStack[T]) Clear() {
77+
x.stack.Clear()
8178
}
8279

8380
func (x *MaxStack[T]) String() string {

0 commit comments

Comments
 (0)