队列的顺序表示-循环队列
队列的表示
#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;
}
循环队列入队
Status EnQueue(SqQueue &Q,QElemType e)
{
if((Q.rear+1)%MAXQSIZE==Q.front) //尾指针在循环意义上加1后等于头指针,表明队满
return ERROR;
Q.base[Q.rear]=e; //新元素插入队尾
Q.rear=(Q.rear+1)%MAXQSIZE; //队尾指针加1
return OK;
}
循环队列出队
Status DeQueue (LinkQueue &Q,QElemType &e)
{
if(Q.front==Q.rear) return ERROR;//队空
e=Q.base[Q.front];//保存队头元素
Q.front=(Q.front+1)%MAXQSIZE;//队头指针加1
return OK;
}
链队列
链队列的表示
typedef struct QNode
{
QElemType data;
struct Qnode *next;
}Qnode, *QueuePtr;
typedef struct
{
QueuePtr front; //队头指针
QueuePtr rear; //队尾指针
}LinkQueue;
链队列的初始化
Status InitQueue (LinkQueue &Q)
{
Q.front=Q.rear=(QueuePtr) malloc(sizeof(QNode));//生成新结点作为头结点,队头和队尾指针指向此结点
if(!Q.front) exit(OVERFLOW);
Q.front->next=NULL;//头结点的指针域置空
return OK;
}
链队列入队
Status EnQueue(LinkQueue &Q,QElemType e)
{
p=(QueuePtr)malloc(sizeof(QNode));//为入队元素分配结点空间,用指针p指向
if(!p) exit(OVERFLOW);
p->data=e; //将新结点插入到队尾
p->next=NULL;Q.rear->next=p;//将新结点插入到队尾
Q.rear=p;//修改队尾指针
return OK;
}
链队列的出队
Status DeQueue (LinkQueue &Q,QElemType &e)
{
if(Q.front==Q.rear) return ERROR;//若队列空,则返回ERROR
p=Q.front->next;//p指向队头元素
e=p->data;//e保存队头元素的值
Q.front->next=p->next;//修改头结点的指针域
if(Q.rear==p) Q.rear=Q.front;//最后一个元素被删,队尾指针指向头结点
delete p;//释放原队头元素的空间
return OK;
}