栈与队列都是操作受限的线性表。
何为线性表呢?线性表是具有相同数据类型的 n(n>=0) 个数据元素的有限序列。
栈是只允许在一段进行操作的数据结构,我们可以把只在数组尾进行操作的数组视为一个栈。
栈可以分为 顺序栈、共享栈、链栈,接下来我们会谈论一下这三个栈,并用代码实现一下。
从存储结构来分,我们可以分为顺序存储和链式存储。顺序存储:顺序栈,共享栈;链式存储:链栈。
顺序栈:类似数组。
共享栈:两个栈共享同一块空间,其有两个指针,分别指向栈的两端。栈空就是 top0 = -1, top1 = MaxSize,栈满:top0 + 1 = top1。
链栈:用单链表实现的栈,但是只能在链表头部进行操作,注意链栈是没有额外的头结点。
另外,还有一个重要的 单调栈,在 LeetCode 刷题过程中,单调栈是一个很重要的应用。单调栈是一个单调递增或递减的栈,你可能会疑惑,栈进入的元素是随意的,你怎么保证里面的元素是有序的呢,其实可以另开一个栈来保存入栈时出栈的元素;或者入栈时,比新入栈元素小的或大的元素都可以忽略,LeetCode就有应用到这种情况的单调栈。
栈的应用主要有:栈在括号中的应用,栈在表达式求值中应用,递归,树的递归遍历。
队列是可以在两端进行操作的数据结构,但是只能在队尾入队,队头出队。
队列可以分为 一般队列、循环队列、链式队列、双端队列、优先队列。
另外还有一个重要应用 单调队列,LeetCode 刷题也会用到此种数据结构。
队列的应用主要有:树的层次遍历,图的广度优先遍历。