循环队列的操作——队列的初始化
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 ); }
循环队列的操作——循环队列出队
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]; } }