后进先出,不能从中间任意抽取,砌墙模型。栈有两种实现方式:基于数组的顺序栈和基于链表的链式栈。
从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。
实现方式
- 顺序栈
用数组实现
type AStack struct {items []stringlock sync.RWMutex}func (s *AStack) Push(val string) {s.lock.Lock()defer s.lock.Unlock()s.items = append(s.items, val)return}func (s *AStack) Pop() string {s.lock.Lock()var res stringdefer s.lock.Unlock()if len(s.items) != 0 {res = s.items(len(s.items)-1)s.items = s.items[:len(s.items)-1]}return res}
- 链式栈
用链表实现
type node struct {item stringprv *node}type LStack struct {head *nodelen intlock *sync.RWMutex}func (s *LStack) Push(val string) {s.lock.Lock()defer s.lock.Unlock()// 新的结点连接到原始链表的头n := &node{item: valprv: s.head}// 将原始链表的头移动到新结点s.head = ns.len++}
栈的应用
1. 括号匹配
如LeetCode题目20
2. 进制转换
参考:https://blog.csdn.net/gavin_john/article/details/71374487
