数据结构复习之栈和队列

栈的概念

  栈(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)。解决了移动数据的时间损耗。

  队列的链式存储结构

    其实质是线性表的单链表,只不过它只能尾仅头出而已,简称为链队列。

  建议:

    总的来说,在可以确定队列长度最大值的情况下,建议使用循环队列,如果无法预估队列长度时,使用链队列。

  

原文地址:https://www.cnblogs.com/changyaohua/p/4655520.html