隊列(循環隊列)


隊列

隊列的類型定義

基本概念

只允許在一端插入數據操作,在另一端進行刪除數據操作的特殊線性表;進行插入操作的一端稱為隊尾(入隊列),進行刪除操作的一端稱為隊頭(出隊列);隊列具有先進先出(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;
}

轉載隊列博客
循環對列
鏈隊列


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM