队列:具有一定操作约束的线性表
插入和删除操作:只能在一端插入,而在另一端删除
先来先服务,先入先出
一、顺序存储
front:记录队列头元素位置的变量
rear:记录队列尾元素位置的变量
加入一个元素,rear加1;删除一个元素,front加1
1.结构体
#define MaxSize <存储数据元素的最大个数>
struct QNode{
ElementType Data[ MaxSize ];
int rear;
int front;
};
typedef struct QNode *Queue;
2.入队
void AddQ( Queue PtrQ, ElementType item)
{
if ((PtrQ->rear+1) % MaxSize == PtrQ->front ){
printf("队列满");
return;
}
PtrQ->rear = (PtrQ->rear+1) % MaxSize;
PtrQ->Data[PtrQ->rear] = item;
}
3.出队
ElementType DeleteQ( Queue PtrQ )
{
if ( PtrQ->front == PtrQ->rear ){
printf("队列空");
return ERROR;
}
else{
PtrQ->front = (PtrQ->front+1) % MaxSize;
return PtrQ->Data[PtrQ->front];
}
}
二、链式存储
1.结构体
struct Node{
ElementType Data;
struct Node *Next;
};
struct QNode{ /*链队列结构*/
struct Node *rear; /*指向队尾结点*/
struct Node*front; /*指向队头结点*/
};
typedef struct QNode *Queue;
Queue PtrQ;
2.出队(不带头结点的链式队列)
ElementType DeleteQ ( Queue PtrQ )
{
struct Node *FrontCell;
ElementType FrontElem;
if ( PtrQ->front == NULL){
printf(“队列空");
return ERROR;
}
FrontCell = PtrQ->front;
if ( PtrQ->front == PtrQ->rear) /*若队列只有一个元素*/
PtrQ->front = PtrQ->rear = NULL; /*删除后队列置为空*/
else
PtrQ->front = PtrQ->front->Next;
FrontElem = FrontCell->Data;
free( FrontCell ); /*释放被删除结点空间*/
return FrontElem;
}