数据结构(二) 栈和队列

 二、栈和队列

  1、栈的表示与实现

  2、栈的应用

  3、队列的表示和实现

    链队列

    循环队列

栈和队列

         栈和队列都是特殊的线性表,它们的基本操作是线性表操作的子集,是操作受限的线性表。

         特点:只在表头进行插入与删除操作。表头端成为栈顶,表尾称栈底。

         LIFO:后进先出。

栈的实现

         栈的实现有两种方法:顺序栈和链栈。

         顺序栈利用一组地址连续最大长度为MAX_STACK_SIZE的存储单元依次存放从栈底到栈顶的数据元素。

         在程序中同时使用多个栈的情形下,使用链式栈不但可以提高存储效率,同时还可达到共享存储的目的。链式栈一般不使用头节点。

队列(queue)

         FIFO:先进先出,只允许在一端插入,在另一端删除。

         队列的两种存储结构:顺序存储、链式存储。

  1、  链队列

  链队列应有2个分别指示队头队尾的指针,即头指针与尾指针。

  如果从队列中退出一个元素,必须从单链表的第一个节点中取出队头元素,并删除此节点,而入队的新元素是存放在队尾处的,也就是单链表的最后一个元素的后面,并且此结点会成为新的队尾。

  Ps:队列适合于数据元素变动比较大的情形,一般不存在溢出的问题,如果程序中要使用多个队列,最好使用链队列,这样将不会出现存储分配问题,也不必进行数据元素的移动。

  2、  循环队列

  队列的顺序存储结构,实际是利用一个容量是maxSize的一维数组elem作为队列的元素的存储结构,并设立的两个front和rear分别表示队头和队尾。

  当队列的实际可用空间还没有使用完却不能再插入新元素,这种情形继续插入会产生溢出叫做“假溢出”。

  为了解决假溢出,我们把顺序队列从逻辑上看成一个环,成为循环队列,循环队列首尾相接。

  循环队列中,从front=rear无法判断是队空还是队满,有3中处理办法:

  A、 另设一个标志符区别队列是空还是队满。

  B、  用一个数据成员存储元素的个数。

  C、  少用一个元素空间,约定在队尾指针的下一位置作为队满的标志。

原文地址:https://www.cnblogs.com/bigbigbigo/p/8616852.html