Skip to content

Commit af585cf

Browse files
committed
update
1 parent 280545b commit af585cf

File tree

5 files changed

+262
-14
lines changed

5 files changed

+262
-14
lines changed

README.md

Lines changed: 145 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,150 @@
1-
# Go的各种栈实现
1+
# Go Stack
22

3-
2022-10-22 02:07:40 Code Review
3+
# 一、这是什么?为什么使用它?优势是啥?
4+
5+
这个项目是各种类型的栈的Go语言实现版本。
6+
7+
- 支持泛型,API使用更方便,避免类型强转
8+
- 对每种类型的栈都提供了线程安全版本,使用的时候可以专注业务不需要再考虑锁的问题了
9+
- 支持的栈类型更丰富,如果有更多有意思的栈,请提issues call me实现
10+
11+
# 二、安装
12+
13+
```bash
14+
go get github.com/CC11001100/go-stack
15+
```
16+
17+
# 三、目前实现的栈
18+
19+
- ArrayStack[T any]
20+
- SyncArrayStack[T any]
21+
- LinkedStack[T any]
22+
- SyncLinkedStack[T any]
23+
- MinStack[T any]
24+
- SyncMinStack[T any]
25+
- MaxStack[T any]
26+
- SyncMaxStack [T any]
27+
28+
### 一览表
29+
30+
| Struct名称 | 线程安全性 | 阻塞性 | 特有特性 |
31+
| ---------------------- | :--------: | :----: | -------- |
32+
| ArrayStack[T any] | × | × | |
33+
| SyncArrayStack[T any] || × | |
34+
| LinkedStack[T any] | × | × | |
35+
| SyncLinkedStack[T any] || × | |
36+
| MinStack[T any] | × | × | |
37+
| SyncMinStack[T any] || × | |
38+
| MaxStack[T any] | × | × | |
39+
| SyncMaxStack [T any] || × | |
40+
41+
42+
43+
# 四、Interface: Stack
44+
45+
接口定义的接口定义
46+
47+
48+
49+
## 入栈
50+
51+
```
52+
Push(values ...T) error
53+
```
54+
55+
56+
57+
## 出栈
58+
59+
```
60+
Pop() T
61+
PopE() (T, error)
62+
```
63+
64+
65+
66+
## 查看栈顶元素
67+
68+
```
69+
Peek() T
70+
PeekE() (T, error)
71+
```
72+
73+
74+
75+
## 判断栈是否空
76+
77+
```
78+
IsEmpty() bool
79+
IsNotEmpty() bool
80+
```
81+
82+
83+
84+
## 栈中元素个数
85+
86+
```
87+
Len() int
88+
```
89+
90+
91+
92+
## 清空栈
93+
94+
```
95+
Clear() error
96+
```
97+
98+
99+
100+
## ArrayStack
101+
102+
数组实现的栈适合频繁入栈出栈的操作
103+
104+
### 数组缩容
105+
106+
可能会存在的坑:类似于GO内置的map,默认情况下ArrayStack底层的数组也是只增长不缩容的,如果你的栈中的元素的个数具有先是很多,然后一直保持在一个较少的样子,建议在栈相对平稳之后调用TrimArray方法来让底层的数组释放掉短时间内不会再使用的空间。
107+
108+
### 数组扩容到指定长度
109+
110+
允许对底层数组进行一些微操。
111+
112+
113+
114+
## SyncArrayStack
115+
116+
## LinkedStack
117+
118+
## SyncLinkedStack
119+
120+
121+
122+
# 五、最大栈 & 最小栈
123+
124+
## MinStack
125+
126+
## SyncMinStack
127+
128+
## MaxStack
129+
130+
SyncMaxStack
131+
132+
133+
134+
# 六、阻塞栈
135+
136+
因为仅当多个协程操作同一个栈时才需要考虑阻塞的情况,所以阻塞栈都是线程安全的。
137+
138+
139+
140+
141+
142+
# TODO
143+
144+
TODO 2022-10-22 02:07:40 Code Review
4145
TODO 2022-10-22 02:04:55 测试
5-
TODO 2022-10-22 02:03:14 编写文档
6-
7-
目前实现的栈:
8-
9-
- ArrayStack
10-
- SyncArrayStack
11-
- LinkedStack
12-
- SyncLinkedStack
13-
- MinStack
14-
- SyncMinStack
15-
- MaxStack
16-
- SyncMaxStack
146+
TODO 2022-10-22 02:03:14 编写文档
147+
17148

18149

19150

errors.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@ package stack
33
import "errors"
44

55
var ErrStackEmpty = errors.New("stack empty")
6+
7+
var ErrContextTimeout = errors.New("timeout")

stack.go

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

3+
// Stack 定义栈的API
34
type Stack[T any] interface {
5+
6+
// Push 往栈中加入元素
47
Push(values ...T) error
58

69
Pop() T

stack_blocking.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package stack
2+
3+
//import "context"
4+
//
5+
//// BlockingStack 带有阻塞特性的栈
6+
//type BlockingStack[T any] interface {
7+
// Stack[T]
8+
//
9+
// BPush(ctx context.Context, values ...T) error
10+
//
11+
// BPop(ctx context.Context, ) T
12+
// BPopE(ctx context.Context, ) (T, error)
13+
//
14+
// BPeek(ctx context.Context, ) T
15+
// BPeekE(ctx context.Context, ) (T, error)
16+
//}

stack_blocking_impl.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package stack
2+
3+
//import "context"
4+
//
5+
//type BlockingStackImpl[T any] struct {
6+
// stack chan T
7+
//}
8+
//
9+
//var _ BlockingStack[any] = &BlockingStackImpl[any]{}
10+
//
11+
//func NewBlockingStack[T any](capacity int) *BlockingStackImpl[T] {
12+
// return &BlockingStackImpl[T]{
13+
// stack: make(chan T, capacity),
14+
// }
15+
//}
16+
//
17+
//func (x *BlockingStackImpl[T]) Push(values ...T) error {
18+
//}
19+
//
20+
//func (x *BlockingStackImpl[T]) Pop() T {
21+
// //TODO implement me
22+
// panic("implement me")
23+
//}
24+
//
25+
//func (x *BlockingStackImpl[T]) PopE() (T, error) {
26+
// //TODO implement me
27+
// panic("implement me")
28+
//}
29+
//
30+
//func (x *BlockingStackImpl[T]) Peek() T {
31+
// //TODO implement me
32+
// panic("implement me")
33+
//}
34+
//
35+
//func (x *BlockingStackImpl[T]) PeekE() (T, error) {
36+
// //TODO implement me
37+
// panic("implement me")
38+
//}
39+
//
40+
//func (x *BlockingStackImpl[T]) IsEmpty() bool {
41+
// //TODO implement me
42+
// panic("implement me")
43+
//}
44+
//
45+
//func (x *BlockingStackImpl[T]) IsNotEmpty() bool {
46+
// //TODO implement me
47+
// panic("implement me")
48+
//}
49+
//
50+
//func (x *BlockingStackImpl[T]) Len() int {
51+
// //TODO implement me
52+
// panic("implement me")
53+
//}
54+
//
55+
//func (x *BlockingStackImpl[T]) Clear() error {
56+
// //TODO implement me
57+
// panic("implement me")
58+
//}
59+
//
60+
//func (x *BlockingStackImpl[T]) String() string {
61+
// //TODO implement me
62+
// panic("implement me")
63+
//}
64+
//
65+
//func (x *BlockingStackImpl[T]) BPush(ctx context.Context, values ...T) error {
66+
// //TODO implement me
67+
// panic("implement me")
68+
//}
69+
//
70+
//func (x *BlockingStackImpl[T]) BPop(ctx context.Context) T {
71+
// //TODO implement me
72+
// panic("implement me")
73+
//}
74+
//
75+
//func (x *BlockingStackImpl[T]) BPopE(ctx context.Context) (T, error) {
76+
// select {
77+
// case value := <-x.stack:
78+
// return value, nil
79+
// case <-ctx.Done():
80+
// return nil, ErrContextTimeout
81+
// }
82+
//}
83+
//
84+
//func (x *BlockingStackImpl[T]) BPeek(ctx context.Context) T {
85+
// e, _ := x.BPeekE(ctx)
86+
// return e
87+
//}
88+
//
89+
//func (x *BlockingStackImpl[T]) BPeekE(ctx context.Context) (T, error) {
90+
// select {
91+
// case value := <-x.stack:
92+
// return value, nil
93+
// case <-ctx.Done():
94+
// return nil, ErrContextTimeout
95+
// }
96+
//}

0 commit comments

Comments
 (0)