队列

队列是一种特殊的线性表。 它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。 不含元素的空表称为空队列。队列又称为先进先出(first in first out)的线性表。

1.顺序(循环)队列的实现

在实现之前先把需要使用到的库和头文件进行包含 
所需的头文件queue.h已经在上方提供

#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
1)构造一个空的队列
Status InitQueue_Q(SqQueue &Q){
	//构造一个空的队列
	Q.base = (QElemType *)malloc(MAXQSIZE*sizeof(QElemType));
	if(!Q.base)
	return ERROR;
	Q.front = 0;
	Q.rear = 0;
	return OK; 
}//InitQueue_Q
2)销毁队列
Status DestoryQueue_Q(SqQueue &Q){
	//销毁队列
	free(Q.base);
	Q.base = NULL;
	return OK; 
}//DestoryQueue_Q
3)清空队列
Status ClearQueue_Q(SqQueue &Q){
	//清空队列
	Q.front = Q.rear;
	return OK; 
}//ClearQueue_Q
4)判断队列是否为空
Status QueueEmpty_Q(SqQueue &Q){
	//判断是否为空
	if(Q.front = Q.rear)
	return TRUE;
	else
	return FALSE; 
}//QueueEmty_Q
5)获取队列中元素的个数
Status QueueLength_Q(SqQueue Q){
	//返回队列Q中元素的个数
	return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; 
}//QueueLength_Q
6)取队列头元素
Status GetHead_Q(SqQueue Q,QElemType &e){
	//取队列头元素,并用e返回,若队列为空返回ERROR,否则返回OK
	if(Q.front = Q.rear)
	return ERROR;
	e = *(Q.base+Q.front); 
}//GetHead_Q
7)插入元素到队尾
Status EnQueue_Q(SqQueue &Q,QElemType e){
	//插入元素e为Q的新队尾元素,队列已满返回ERROR,否则返回OK 
	if((Q.rear+1)%MAXQSIZE == Q.front)
	return ERROR;
	*(Q.base+Q.rear) = e;
	Q.rear = (Q.rear + 1)%MAXQSIZE;
	return OK;
}//EnQueue_Q
8)删除队头元素
Status DeQueue_Q(SqQueue &Q,QElemType e){
	//若队列不为空,则删除Q的队头元素,用e返回其值,并返回OK
	if(Q.front = Q.rear)
	return ERROR;
	e = *(Q.base+Q.front);
	Q.front = (Q.front+1)%MAXQSIZE; 
}//DeQueue_Q
9)调用visit()函数遍历队列
Status visit_display_Q(QElemType e){
	//打印元素
	printf("%d\n",e);
	return OK;
}//visit_display_Q
Status QueueTraverse_Q(SqQueue Q,Status (*visit)(QElemType e)){
	//从队头到队尾依次对队列Q中每个元素调用函数visit()。一旦visit失效,则操作失败
	int p;
	p = Q.front;
	while(p != Q.rear)
	{
		if(!(*visit)(*(Q.base+p)))
		return ERROR;
		p = (p+1)%MAXQSIZE;
	}
	return OK;
}//QueueTreaverse_Q

发表评论

邮箱地址不会被公开。 必填项已用*标注