堆栈(英语: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国际许可协议进行许可