队列是一种限定性线性表,它只允许在表的一端插入元素,所以队列具有先进先出的特性。允许插入的一端称为队尾(Rear),允许删除的一端称为队头(Front)。
链队列
链队列结构
typedef struct Node {
QueueElementType data;
struct Node *next;
} LinkQueueNode;
typedef struct {
LinkQueueNode *front;
LinkQueueNode *rear;
} LinkQueue;
初始化
int InitQueue(LinkQueue *Q) {
Q->front = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));
if(Q->front != NULL){
Q->rear = Q->front;
Q->front->next = NULL;
return TRUE;
}
else
return FALSE;//溢出!
}
入队
int EnterQueue(LinkQueue *Q, QueueElementType x){
LinkQueueNode *NewNode;
NewNode = (LinkQueueNode*)malloc(sizeof(LinkQueueNode));//申请空间
if(NewNode != NULL){
NewNode->data = x;
NewNode->next = NULL;
Q->rear->next = NewNode;
Q->rear = NewNode;
return TRUE;
}
else
return FALSE;//溢出!
}
出队
int DeleteQueue(LinkQueue *Q, QueueElementType *x){
LinkQueueNode *p;
if(Q->front == Q->rear)
return FALSE;
p = Q->front->next;
Q->front->next = p->next;
if(Q->rear == p)//如果队中只有一个元素p,则p出队后成为空队
Q->rear = Q->front;
*x = p->data;
free(p);//释放空间
return TRUE;
}
循环队列
循环队列是队列的一种顺序表示和实现方法,与顺序栈类似,在队列的顺序存储结构中,用一组地址连续的存储单元依次有序存放从队头到队尾的元素。
循环队列结构
#define MAXSIZE 20
typedef struct {
QueueElementType element[MAXSIZE];
int front;
int rear;
}SeqQueue;
初始化
void InitQueue(SeqQueue *Q){
Q->front = Q->rear = 0;
}
入队
int EnterQueue(SeqQueue *Q, QueueElementType x){
if((Q->rear+1)%MAXSIZE == Q->front)//尾指针加1追上头指针,标志队列已经满了
return FALSE;
Q->element[Q->rear] = x;
Q->rear = (Q->rear+1)%MAXSIZE;
return TRUE;
}
出队
int DeleteQueue(SeqQueue *Q, QueueElementType *x){
if(Q->front == Q->rear)//空队列
retuen FALSE;
*x = Q->element[Q->front];
Q->front = (Q->front+1)%MAXSIZE;
return TRUE;
}