• 队列之顺序存储实现


    队列

    • 特点: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];
            }
        }
    
  • 相关阅读:
    对象与内存控制1---实例变量和类变量
    数组与内存控制2--数组使用
    数组与内存控制1--数组初始化
    Java 三大特征之--多态
    简述Java面向对象三大特征:封装、继承、多态
    java程序初始化的顺序
    关于public static void main(String[] args)相关知识
    Java的优点
    前端面试攻略3------HTML和CSS部分
    前端面试攻略2------计算机网络部分
  • 原文地址:https://www.cnblogs.com/vancasola/p/7670045.html
Copyright © 2020-2023  润新知