队列
ADT 队列
Operation:
InitQueue(*Q);
DestroyQueue(*Q);
ClearQueue(*Q);
QueueEmpty(Q);
GetHead(Q,*e);
EnQueue(*Q,e);
DeQueue(*Q,*e);
QueueLength(Q);
结构代码
typedef int QElemType;
typedef struct{
int front;
int rear;
QElemType data[MaxSize];
}SqQueue;
循环队列
初始化
Status InitQueue(SqQueue *Q){
Q->front=0;
Q->rear=0;
return OK;
}
循环队列的长度
int QueueLength(SqQueue Q){
return (rear-front+MaxSize)%MaxSize;
}
入队
Status EnQueue(SqQueue *Q, QElemType e){
if((Q->rear+1)%MaxSize==Q->front)
return ERROR;
Q->data[Q->rear]=e;
Q->rear=(Q->rear+1)%MaxSize;
return OK;
}
出队
Status DeQueue(SqQueue *Q, QElemType *e){
if(Q->rear==Q->front)
return ERROR;
*e=Q->data[Q->front];
Q->front=(Q->front+1)%MaxSize;
return OK;
}
队列的链式存储结构
结构代码
链队列有头结点
typedef int QElemType;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct LinkQueue{
QueuePtr front, rear;
}LinkQueue;
入队
Status EnQueue(LinkQueue *Q, QElemType e){
QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
if(!s) //储存分配失败
exit(OVERFLOW);
s->data=e;
s->next=NULL;
Q->rear->next=s;
Q->rear=s;
return OK;
}
出队
Status DeQueue(LinkQueue *Q, QElemType *e){
if(Q->front==Q->rear)
return ERROR;
QueuePtr p;
p=Q->front->next;
*e=p->data;
Q->front->next=p->next;
//若队头是队尾,则删除后将rear指向头结点
if(Q->rear=p)
Q->rear=Q->front;
free(p);
return OK;
}