</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;
}
循環列隊的循序結構
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.