堆栈(英语:stack)又称为栈或堆叠,是计算机科学中的一种抽象数据类型,只允许在有序的线性数据集合的一端(称为堆栈顶端,英语:top)进行加入数据(英语:push)和移除数据(英语:pop)的运算。因而按照后进先出(LIFO, Last In First Out)的原理运作。

常与另一种有序的线性数据集合队列相提并论。

堆栈常用一维数组或链表来实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
type Stack interface {
Push(i int)
Pop() (i int, err error)
}

type stack struct {
slice []int
}

func (s *stack) Push(i int) {
s.slice = append(s.slice, i)
}

func (s *stack) Pop() (i int, err error) {
if len(s.slice) == 0 {
return i, errors.New("no int in stack")
}
i = s.slice[len(s.slice)-1]
s.slice = s.slice[:len(s.slice)-1]
return
}

栈模拟队列

队列是fifo结构,先进先出,栈是后进先出,若是用栈模拟队列该如何实现呢,这就需要使用到两个栈,一个存,一个取,类似于左手倒右手的操作来实现先进先出的特性。

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
type Queue interface {
// 将 i 添加到 队尾
Add(i int)
// 返回队首的i, 如果队空,则返回error
Remove() (i int, err error)
}

type Stack interface {
Push(i int)
Pop() (i int, err error)
}

type stack struct {
slice []int
}

func (s *stack) Push(i int) {
s.slice = append(s.slice, i)
}

func (s *stack) Pop() (i int, err error) {
if len(s.slice) == 0 {
return i, errors.New("no int in stack")
}
i = s.slice[len(s.slice)-1]
s.slice = s.slice[:len(s.slice)-1]
return
}

// 栈组成的队列
type queueFromStack struct {
fs *stack // 负责存的
ss *stack // 负责取的
}

func NewQueue() *queueFromStack {
return &queueFromStack{
fs: new(stack),
ss: new(stack),
}
}

func (q *queueFromStack) Add(i int) {
q.fs.Push(i)
}

// 这一步是O(n)的时间复杂度
func (q *queueFromStack) Remove() (ret int, err error) {
for {
pop, _ := q.fs.Pop()
// 取走队尾
if len(q.fs.slice) == 0 {
ret = pop
break
}
q.ss.Push(pop)
}
for len(q.ss.slice) > 0 {
pop, _ := q.ss.Pop()
q.fs.Push(pop)
}
return
}


推荐文章(由hexo文章推荐插件驱动)