堆栈(英语: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 { Add(i int) 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) }
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 }
|
本文标题:go实现stack
文章作者:小师
发布时间:2019-06-23
最后更新:2019-06-23
原始链接:chunlife.top/2019/06/23/go实现stack/
版权声明:本站所有文章均采用知识共享署名4.0国际许可协议进行许可