一、什么是栈 & 队列
栈和队列也都是一种线性表,只是它们的操作是受限的:
- 栈只允许在一端插入(push)和删除(pop)数据,先进后出。
- 队列在只允许在两端操作数据,有入队(enqueue)和出队(dequeue)两种操作,先进先出。
和 数组 或者 链表 的特点归功于它们底层的数据组织形式不同,栈和队列的特点归功于数据的操作限制(或者称为约定)。栈和队列既可以基于数组实现,也可以基于链表实现。
二、“受限”的价值
既然 栈好队列 只是操作受限的数组或者链表,那么他们存在的价值是什么呢,我们为什么不直接使用数组或者链表呢?
从功能上来说,数组或链表确实可以替代栈,但特定的数据结构是对特定场景的抽象,暴露过多接口的在提高使用灵活的同时也提高了出错的概率。
三、栈的用途
栈比较通用的主要用途有:
- 函数调用栈。
- 表达式求值。
- 括号匹配。
四、队列的用途
常用于在资源有限时候的排队策略实现。