顺序循环队基本操作
//-------队列的顺序存储结构--------
//------------定义-----------------
#define MaxQSize 100 //队列可达到的最大长度
typedef struct
{
QElemType *base; //存储空间的基地址
int front; //头指针
int rear; //尾指针(记录实际队尾的后一个元素)
}SqQueue;
//---------------初始化--------------
Status InitQueue(SqQueue &Q)
{
Q.base = new QElemType[MaxQSize]; //为队列分配一个最大容量为MaxQSize的数组空间
if (!Q.base)
exit (overflow);
Q.front = Q.rear = 0; //头指针和尾指针置为0,表示队列为空
return ok;
}
//---------- 求队列的长度-------------
//对于非循环队列,尾指针和头指针的差值便是队列的长度,
//而对于循环队列,差值有可能为负值,因此需要加上MaxQSize,再与MaxQSize求余
int QueueLength(SqQueue Q)
{
return (Q.rear - Q.front + MaxQSize) % MaxQSize;
}
//--------------入队--------------
/* 入队操作是在队尾插入一个新的元素,入队需要判满,将新元素插入,队尾指针加一 */
status EnQueue (SqQueue &Q , QElemType e)
{ //插入新元素e为Q的新的队尾元素
if ((Q.rear + 1) % MaxQSize == Q.front ) //判断队满
return error;
Q.base[Q.rear] = e; //新元素插入队尾
Q.rear = (Q.rear + 1) % MaxQSize ; //队尾指针加一
return ok;
}
//--------------出队----------------
/* 出队判空,保存队头元素,队头指针加一 */
status DeQueue (SqQueue &Q, QElemType &e)
{ //删除队头原则,用e返回其值
if ( Q.front == Q.rear ) //判断队空
return error;
e = Q.base[Q.front]; //保存队头
Q.front = (Q.front + 1) % MaxQSize; //队头指针加一
return ok;
}
//--------------取队头元素--------------
status GetHead(SqQueue Q)
{
if (Q.front != Q.rear) //队列非空
return Q.base[Q.front]; //返回队头元素的值,队头指针不变
}
顺序循环队基本操作代码块
于 2022-05-17 21:07:22 首次发布