后进先出,不能从中间任意抽取,砌墙模型。栈有两种实现方式:基于数组的顺序栈和基于链表的链式栈。
从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。
image.png

实现方式

  • 顺序栈

用数组实现

  1. type AStack struct {
  2. items []string
  3. lock sync.RWMutex
  4. }
  5. func (s *AStack) Push(val string) {
  6. s.lock.Lock()
  7. defer s.lock.Unlock()
  8. s.items = append(s.items, val)
  9. return
  10. }
  11. func (s *AStack) Pop() string {
  12. s.lock.Lock()
  13. var res string
  14. defer s.lock.Unlock()
  15. if len(s.items) != 0 {
  16. res = s.items(len(s.items)-1)
  17. s.items = s.items[:len(s.items)-1]
  18. }
  19. return res
  20. }
  • 链式栈

用链表实现

  1. type node struct {
  2. item string
  3. prv *node
  4. }
  5. type LStack struct {
  6. head *node
  7. len int
  8. lock *sync.RWMutex
  9. }
  10. func (s *LStack) Push(val string) {
  11. s.lock.Lock()
  12. defer s.lock.Unlock()
  13. // 新的结点连接到原始链表的头
  14. n := &node{
  15. item: val
  16. prv: s.head
  17. }
  18. // 将原始链表的头移动到新结点
  19. s.head = n
  20. s.len++
  21. }

栈的应用

1. 括号匹配

如LeetCode题目20

2. 进制转换

参考:https://blog.csdn.net/gavin_john/article/details/71374487