队列,和栈一样,也是一种对数据的"存"和"取"有严格要求的线性存储结构。与栈结构不同的是,队列的两端都“开口”,要求数据只能从一端进,从另一端出。
逻辑结构 与线性表相同,仍为一对一关系
存储结构 用顺序队列或链队列存储即可
访问结点时依照先进先出(FIFO)或后进后出(LILO)的原则
队列的抽象数据类型
ADT Queue {
数据对象:D={ai| ai∈ElemSet, i=1,2,...,n, n≥0 }
数据关系:R1={
基本操作:
(1) InitQueue (&Q) //构造空队列
(2) DestroyQueue (&Q) //销毁队列
(3) ClearQueue (&S) //清空队列
(4) QueueEmpty(S) //判空. 空--TRUE
(5) QueueLength(Q) //取队列长度
(6) GetHead (Q,&e) //取队头元素,
(7) EnQueue (&Q,e) //入队列
(8) DeQueue (&Q,&e) //出队列
} ADT Queue
队列的顺序表示--用一维数组base[Maxsize]
#define Maxsize 100 //最大队列长度
Typedef struct {
QElemType *base; //初始化的动态分配存储空间,或者QElemType base[Maxsize]
int front; //头指针
int rear; //尾指针
}SqQueue;
空队标志:front= =rear
入队:base[rear++]=x;
出队:x=base[front++]
队空:front==rear 队满:front==rear
队列的循环表示
#define MAXQSIZE 100 //最大长度
Typedef struct {
QElemType *base; //初始化的动态分配存储空间或者QElemType base[MAXQSIZE]
int front; //头指针
int rear; //尾指针
}SqQueue;
循环队列初始化
Status InitQueue (SqQueue &Q){
Q.base =new QElemType[MAXQSIZE];
if(!Q.base) exit(OVERFLOW);
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;
Q.rear=(Q.rear+1)%MAXQSIZE;
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;
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 QueueEmpty (LinkQueue Q){
return (Q.front==Q.rear);
}
销毁链队列---从队头结点开始,依次释放所有结点
Status DestroyQueue (LinkQueue &Q){
while(Q.front){
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
return OK;
}
求链队列的队头元素
Status GetHead (LinkQueue Q, QElemType &e){
if(Q.front==Q.rear) return ERROR;
e=Q.front->next->data;
return OK;
}
链队列入队
Status EnQueue(LinkQueue &Q,QElemType e){
p=(QueuePtr)malloc(sizeof(QNode));
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;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
delete p;
return OK;
}