栈的概念
栈(stack)是限定只能在表尾进行插入和删除操作的线性表。
栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。
允许插入和删除的一段称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。
栈的插入操作,叫做进栈,也称压栈、入栈。(push)
栈的删除操作,叫做出栈,也有叫做弹栈。(pop)
栈的存储方式
栈的顺序存储结构
两栈共享空间
栈的链式存储结构
两种方式的比较:
时间性能:两种存储方式的入栈和出栈的时间复杂度都为O(1)。
空间性能:顺序栈需要事先确定一个固定长度,可能会存在内存空间浪费的问题,但它的优势是存取性能高。
而链栈则要求每个元素都有指针域,这同时也增加了一些内存开销,但对于栈的长度无限制。
栈的应用
编译器使用栈实现递归。
计算机处理标准表达式:
1、将中缀表达式转化为后缀表达式(栈用来进出运算的符号)。
2、将后缀表达式进行运算得出结果(栈用来进出运算的数字)。
队列的概念
队列(queue)是只允许在一端进行插入,而在另外一端进行删除操作的线性表。
队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为对头。
栈的存储方式
队列的顺序存储结构
循环队列
队列满的条件是:(rear + 1) % QueueSize == front
计算队列长度公式为:(rear - front + QueueSize) % QueueSize
循环队列的好处
可以避免数组插入和删除时需要移动数据,使原本插入和删除时O(n)的时间复杂度变成O(1)。解决了移动数据的时间损耗。
队列的链式存储结构
其实质是线性表的单链表,只不过它只能尾仅头出而已,简称为链队列。
建议:
总的来说,在可以确定队列长度最大值的情况下,建议使用循环队列,如果无法预估队列长度时,使用链队列。