队列的顺序表现和实现 02

循环队列的操作——队列的初始化

Status InitQueue(SqQueue &Q){
    // 分配数组空间,其下标为 0 ~ MAXQSIZE-1
    Q.base = new QElemType[MAXQSIZE];
    // 如果用 C 的语法则代码如下:
    Q.base = (QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
    
    // 申请一段内存时,可能会申请失败,因此做如下判断(收元素的地址为一个指针,Q.base 为一个指针)
    if(!Q.base){
        exit(OVERFLOW); //存储分配失败
    }
    
    // 头指针尾指针设置为0,队列为空,(Q.front 和 Q.rear 则是下标)
    Q.front = Q.rear = 0;
    return OK;
}

 

 

循环队列的操作——求队列的长度

int QueueLength(SqQueue Q){
    return(  (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE  );
}

队列的顺序表现和实现 02

 

 

 

 

循环队列的操作——循环队列出队

Status EnQueue(SqQueue &Q, QElemType e){
    // 判断队列是否已满
    if( (Q.rear + 1) % MAXQSIZE == Q.front ){
        // 队满
        return ERROR;
    }
    // 新元素加入队尾,存放在数组尾指针下标的位置
    Q.base[Q.rear] = e;
    // 队尾指针+1
    Q.rear = (Q.rear + 1) % MAXQSIZE;
    return OK;
}

 

 

循环队列的操作——循环队列出队

Status DeQueue(SqQueue &Q, QElemType &e){
    // 队空判断
    if(Q.foront == Q.rear){
        return ERROR;
    }
    // 保存队头元素
    e = Q.base[Q.front];
    // 队头指针 +1
    Q.front = (Q.front + 1) % MAXQSIZE;
    return OK;
}

 

 

循环队列的操作——取队头元素

SElemType GetHead(SqQuere Q){
    // 队列不为空
    if(Q.front != Q.rear){
        // 返回队头指针元素的值,队头指针不变
        return Q.base[Q.front];
    }
}

 

上一篇:循环队列的实现


下一篇:2021-10-11 ! LeetCode226. 翻转二叉树 的前中后层序遍历写法