循環列隊的循序結構

</pre><pre name="code" class="cpp">//1.隊列順序結構的定義

#define MAXQSIZE 100
typedef struct 
{
	QElemType base[MAXQSIZE];//靜態數組
	int front;//隊列頭指針
	int rear;//隊列尾指針
}SqQueue;

//解決隊列的假溢出方法
//1.將循序列隊臆造爲一個環狀空間。尾指針指向頭指針
//2.在對滿的情況下,rear指針和front指針會指向同一個節點元素。
//這時候就相當於對空,因爲隊列爲空的情況下,rear和front指針指向同一元素

//循環隊列怎麼區分對空和對滿呢???
//解決辦法;

//1.因出對而相等,則爲空。因入隊而相等,則爲滿
//2.少用一個元素的空間,約定rear+1=front時,就認爲對滿


//2.循環隊列,隊列順序存儲結構的虛擬實現

#define MAXQSIZE 100//最大列隊長度
typedef struct 
{
	QElemType *base;//初始化的動態分配存儲空間
	int front;//頭指針,若對不空,指向隊列頭元素
	int rear;//尾指針,若隊列不空,指向隊尾元素的下一位置
}SqQueue;

//3.基本操作

Status InitQueue(SqQueue &Q)
{
	//構造一個空隊列Q
	Q.base=(QElemType*)malloc(//開闢隊列的內存空間
		MAXQSIZE*sizeof(QElemType));
	if(!Q.base)//如果隊尾不存在,那麼開闢空間失敗
		exit(OVERFLOW);
	Q.front=Q.rear=0;//空隊列
	return OK;
}


//4.求隊列長度

int QueueLength (SqQueue Q)
{//返回Q的元素個數,即隊列的長度
	return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
	//由於rear也可能小於front,所以這個方法比較實用,相當於求
	//rear-front的絕對值。
}

//5.插入元素E爲Qde 新隊尾元素

Status EnQueue(SqQueue &Q,QElemType e)
{
	if((Q.rear+1)%MAXQSIZE==Q.front)//判斷是否爲對滿
		return ERROR;
	Q.base[Q.rear]=e;//讓新插入的元素爲隊尾元素
	Q.rear=(Q.rear+1)%MAXQSIZE;//移動到下一位,如果對滿,那麼取餘到達第一元素位置
	return OK;
}

//6.入隊和出隊
//入隊:rear=rear+1;入隊隊尾元素加一a4->a5->a6;一次增加
//出隊:front=front+1  出隊時隊首元素加一a4->a3->a2->a1,從右到左出隊

//7.若隊不空,則刪除隊頭元素,用e返回其值,否則,返回ERROR

Status DeQueue(SqQueue &Q,QElemType &e)
{
	if(Q.front==Q.rear)//如果隊列爲空,返回ERROR
		return ERROR;
		e=Q.base[Q.front];//把隊首指針賦給e
	Q.front=(Q.front+1)%MAXQSIZE;//將隊首指針向上移動一個位置
	//如果隊滿,則循環到第一個位置
	return OK;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章