队列
定义
队列简称队,是一种只允许在表的一端进行插入操作,而在表的另一端进行删除操作的线性表。允许插入的一端称为队尾,队尾元素的位置由rear指出;允许删除的一端称为队头, 队头元素的位置由front指出。如下图
队列的基本操作
1、队列的插入(进队、入队)
2、队列的删除(出队、退队)
3、测试队列是否为空
4、检索当前队头元素
5、创建一个空队
队列的顺序存储结构和操作
1、构造原理
在实际程序设计过程中,通常借助一个一维数组QUEUE[0: M–1]来描述队列的顺序存储结构,同时,设置两个变量front与rear分别指出当前队头元素与队尾元素的位置。如下图
C语言实现如下:
#define M 1000
QElemType QUEUE[M];
int front, rear;
2、初始化队列
void INITIALQ( int front, int rear ) {
front= –1;
rear= –1;
}
3、测试队列是否为空
int EMPTYQ( int front,int rear ){
return front==rear;
}
4、插入(进队)算法
int ADDQ( QElemType QUEUE[], int rear, int item ){
if (rear==M-1) /* 队列满,插入失败*/
return 0;
else {
QUEUE[++rear]=item;
return 1; /* 队列未满,插入成功*/
}
}
5、删除(出队)算法
int DELQ( QElemType QUEUE[], int front, int rear, QElemType item ){
if ( EMPTYQ(front,rear) )
return 0; /* 队列为空,删除失败*/
else {
item=QUEUE[++front];
return 1; /* 队列非空,删除成功*/
}
}
队列的链式存储结构和操作
1、构造原理
队列的链式存储结构是用一个线性链表表示一个队列,指针front 与rear分别指向实际队头元素与实际队尾元素所在的链结点。如下图
C语言实现如下
typedef struct node {
QElmeType data;
struct node *link;
} QNode, *QLink;
2、初始化队列
void INITIALQ( QLink front, QLink rear ){
front=NULL;
rear=NULL;
}
3、测试队列是否为空
int EMPTYQ( QLink front ){
return front==NULL;
}
4、插入(进队)算法
#define LEN sizeof(QNode)
int ADDLINKQ( QLink front, QLink rear, QElemType item ){
QLink p;
if(!(p=(Qlink)malloc(LEN)) /* 申请链结点*/
return 0;
p->data=item;
p->link=NULL;
if (front ==NULL)
front=p; /* 插入空队的情况*/
else
rear->link=p; /* 插入非空队的情况*/
rear=p;
return 1;
}
5、删除(出队)算法
int DELLINKQ( QLink front, QLink rear, QElemType item ){
Qlink p;
if ( EMPTYQ(front) )
return 0; /* 队列为空,删除失败*/
else {
p=front;
front=front->link;
item=p->data;
free(p);
return 1; /* 队列非空,删除成功*/
}
}
6、销毁一个队列
void DESLINKQ(QLink front, QLink rear){
while(front){ /* 队列非空时*/
rear=front->link;
free(front); /* 释放一个结点空间*/
front=rear;
}
}