队列(循环队列)

队列

队列的类型定义

基本概念

只允许在一端插入数据操作,在另一端进行删除数据操作的特殊线性表;进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列);队列具有先进先出(FIFO)的特性。

ADT Queue{
	数据对象: D={ai|a1∈ElemSet,i=1,2,...,n,n>=0}
	数据关系:R={<ai,ai-1>|ai∈D,i=1,2,...,n,n>=0}
			约定其中ai为队列头,an为队列尾
	基本操作:
		InitQueue(&Q)
		造作结果:构造一个空队列
		DestroyQueue(&Q)
		初始条件:队列Q已存在
		操作结果:队列Q被销毁,不再存在
		ClearQueue(&Q)
		初始条件:队列Q已存在
		操作结果:将Q清空为空队列
		QueueEmpty(Q)
		初始条件:队列Q已存在
		操作结果:若Q为空队列,返回true,否则,返回false
		QueueLength(Q)
		初始条件:队列Q已存在
		操作结果:返回Q的元素个数,即队列的长度
		GetHead(&Q)
		初始条件:队列Q已存在
		操作结果:返回Q的头元素
		EnQueue(&Q,e)
		初始条件:队列Q已存在
		操作结果:插入e为Q的新的队尾元素
		DeQueue(&Q,&e)
		初始条件:Q为非空队列
		操作结果:删除Q的对头元素,并用e返回其值
		QueueTraverse(Q)
		初始条件:Q为非空队列
		操作结果:从对头到对尾,依次对Q的每个数据元素访问
}ADT Queue

循环队列

为了改变假溢出所以使用循环队列

顺序表示

队列顺序存储结构

#define MAXSIZE 100
typedef struct
{
	QElemType *base;//存储空间的基地址
	int front;//头指针
	int rear;//尾指针
}SqQueue;

初始化

Status InitQueue(SqQueue&Q)
{
	Q.base = new QELemType[MAXSIZE];
	if(!Q.base) return ERROR;
	Q.front = Q.rear = 0;
	return OK;
}

销毁队列

Status DestoryQueue(SqQueue&Q)
{
	if(Q.base)
		delete []Q.base;
	return OK;
}

清空队列

Status ClearQueue(SqQueue&Q)
{
	delete[] Q.base;
    front = rear = 0;
    elements = new T[maxSize];
}

判空

Status EmptyQueue(SqQueue&Q)
{
	return (front == rear) ? true : false;
}

取队长

int QueueLength(SqQueue Q)
{
	return(Q.rear-Q.fornt+MAXSIZE)&MAXSIZE;
}

取对头元素

Status GetHead(SqQueue&Q)
{
	if(Q.front!=Q.rea)
		return Q.base[Q.front];
}

入队

Status EnQueue(SqQueue &Q,QElemType e)
{
	if((Q.rear+1)%MAXSIZE == Q.front)
		return ERROR;
	Q.base[Q.rear]=e;
	Q.rear=(Q.rear+1)%MAXSIZE;//队尾指针加1
	return OK;
}

出队

Status DeQueue(SqQueue &Q,QElemtype &e)
{
	if(Q.fornt==Q.rear)
		return ERROR;
	e=Q.base[Q.front];
	Q.fornt=(Q.front+1)%MAXSIZE;//队头指针加1
	return OK
}

遍历队列

Status QueueTraverse(SqQueue &Q)
{
	int i;
    i=Q.front;
    while(i!=Q.rear)
    {
        printf("%d ",Q.data[i]);
        i=(i+1)%MAXSIZE;
    }
    printf("\n");
    return OK;
}

转载队列博客
循环对列
链队列

队列(循环队列)

上一篇:JRebel热部署


下一篇:redis 简单整理——持久化之AOF[二十]