一、栈
栈是一种后进先出(Last in First Out)的数据结构,简称 LIFO。
【栈的定义】
栈是限制仅在表的一端(表尾)进行操作(插入和删除)的线性表。
表尾又叫栈顶(Top),允许插入和删除,那么另一端就叫做栈底(Bottom),啥也不能干,只能干等着第一个进栈的过来躺着。
栈的插入操作,叫做入栈(push)。存入栈的元素之间没有任何具体的关系,只有到来的时间的先后顺序。
入栈操作涉及的单个数据的进入,所以时间复杂度为 O(1),同时入栈过程中只需要单个的临时存储空间,所以空间复杂度为 O(1)。
栈的删除操作,叫做出栈(pop)。删完了,也就是栈底就是栈顶的时候,就叫空栈。
同理,出栈操作涉及个别数据的出去且出栈过程只需要单个的临时存储空间,所以时间复杂度和空间复杂度都为 O(1)。
存入栈的元素之间没有任何具体关系,只有到来的时间的先后顺序.在这里没有元素的位置、元素的前后顺序等概念。
【栈的存储结构】
在上面说过,栈是线性表,那么它同样有顺序存储和链式存储。
顺序存储
顺序存储的栈叫做顺序栈。
顺序栈使用数组实现,下标为 0 的一端作为栈底,使用 top 做为栈顶,它来指示当前栈顶元素的位置,默认 top = -1 时为空栈。
链式存储
链式存储的栈叫做链栈。
链栈用单链表实现,一般尾节点为栈底,使用头指针指向的节点作为栈顶,不需要头节点。top = NULL 为空栈。
啥同时因为顺序和链式本身的存储特点,顺序栈的元素个数是固定值,存在栈满的情况,而链式栈则不存在栈满的情况,除非内存被塞的满满的。
队列
队列是一种先进先出(First in First Out)的数据结构,简称 FIFO。
【队列的定义】
类比栈,怎么定义队列呢?
队列是限制仅在一端进行插入操作,在另一端进行删除操作的线性表。
允许删除的一端叫做队头,允许插入的一端叫做队尾。队列的插入叫做入队列,队列的删除叫做出队列。
【队列的存储结构】
同为线性表,队列也有链式存储和顺序存储。
链式存储
链式存储的队列叫做链队列。
其实这就是单链表,而且是带头节点的单链表,这样的话对于入队或者出队来说,它们的时间复杂度与单链表的插入和删除的时间复杂度都是一样的,都是 O(1)。