队列之顺序存储实现

队列

  • 特点:FIFO,先入先出,插入删除在两段进行(入队出队)
  • 操作:
  1. 生成。
  2. 判断未满
  3. 判断非空
  4. 入队
  5. 出队

数组实现

  • 一个一维数组
  • 记录头元素位置变量front
  • 记录尾元素位置变量rear
  • 开始时front和rear都是-1。

循环队列

  • 使用求余实现循环

线性数组的问题:

  • 在一个固定长度的数组内,先不断入队直到填满数组,再几次出队。此时rear指向最大位置,数组中仍然有空间,但是却无法再插入元素。

出现一个问题:

  • 若用front=rear表示队列为空,队列满时也会出现front=rear的问题。
  • 出现原因:我们用front和rear的距离来表示情况,距离一共有n种情况,而队列一共有n+1中情况(包括队列为空)。我们无法用n种表示方法来表示n+1种情况。
  • 解决方法:
  1. 使用额外标记:Size或者tag域,size记录元素个数,tag记录最后一次操作。
  2. 仅使用n-1个数组空间

实现代码

  • 此处采用front==rear表示非空
  • 此处采用(rear+1)%maxsize==front表示已满,即队列只存储n-1个元素,rear+1对maxsize取余等于front时一个位置时队列已满。

初始化

  • 建立队列结构体,包括一个头指针,尾指针,最大容量和一个指向数组首地址的指针。
    typedef int Position;
    struct QNode {
        ElementType *Data;     /* 存储元素的数组 */
        Position Front, Rear;  /* 队列的头、尾指针 */
        int MaxSize;           /* 队列最大容量 */
    };
    typedef struct QNode *Queue;

创建队列

  • 创建指向队列指针
  • 创建数组
  • 初始化front和rear的值
  • 初始化最大容量的值
    Queue CreateQueue( int MaxSize )
    {
        Queue Q = (Queue)malloc(sizeof(struct QNode));
        Q->Data = (ElementType *)malloc(MaxSize * sizeof(ElementType));
        Q->Front = Q->Rear = 0;
        Q->MaxSize = MaxSize;
        return Q;
    }

判断已满

  • rear+1对maxsize取余等于front时一个位置时队列已满
    bool IsFull( Queue Q )
    {
        return ((Q->Rear+1)%Q->MaxSize == Q->Front);
    }

入队

  • 判断队列未满
  • rear位置后移,rear得到值。
    bool AddQ( Queue Q, ElementType X )
    {
        if ( IsFull(Q) ) {
            printf("队列满");
            return false;
        }
        else {
            Q->Rear = (Q->Rear+1)%Q->MaxSize;
            Q->Data[Q->Rear] = X;
            return true;
        }
    }

判断非空

  • 利用front==rear判断
    bool IsEmpty( Queue Q )
    {
        return (Q->Front == Q->Rear);
    }

出队

  • 判断非空
  • front后移,元素出队。
     
    ElementType DeleteQ( Queue Q )
    {
        if ( IsEmpty(Q) ) { 
            printf("队列空");
            return ERROR;
        }
        else  {
            Q->Front =(Q->Front+1)%Q->MaxSize;
            return  Q->Data[Q->Front];
        }
    }
posted @ 2017-10-15 10:01  范加索尔拉  阅读(248)  评论(0编辑  收藏  举报