//這一步很重要!將隊(duì)頭和隊(duì)尾指針?biāo)饕齫->front,q->rea都賦值為0,即同時(shí)指向數(shù)組第一個(gè)元素
if((q->rear+1)%MAXSIZE==q->front)//先判斷隊(duì)列是否已滿,因?yàn)槿腙?duì)從隊(duì)尾rear處開始,所以先判斷rear指針?biāo)饕?/div>
/*
表達(dá)式(q->rear+1)%MAXSIZE也叫取模運(yùn)算,該表達(dá)式能確保(q->rear+1)%MAXSIZE的結(jié)果小于MAXSIZE!
這樣可以確保數(shù)組指針不越界。為什么要rear加1呢?騰出一個(gè)數(shù)據(jù)的空閑空間。
這種算法很技巧!
*/
{
printf("隊(duì)列已滿!\n");
return;
}
q->base[q->rear]=e;//
q->rear=((q->rear+1)%MAXSIZE);//這一步既實(shí)現(xiàn)了指針前移同時(shí)還實(shí)現(xiàn)了指針不越界!技巧!
}
//出隊(duì)操作,出隊(duì)是從隊(duì)頭front處開始
void DeleteQueue(Queue * q,ElemType *e)
{
if(q->front==q->rear)//已空,說明隊(duì)列元素已經(jīng)刪除完畢
{
printf("老大,隊(duì)列已空!\n");
return;
}
// *(e++)=q->base[q->front];//完成此步還不夠!還需要指針?biāo)饕莆唬∽⒁赓x值方法!
*e=q->base[q->front];//完成此步還不夠!還需要指針?biāo)饕莆!注意賦值方法!
q->front=(q->front+1)%MAXSIZE; //指針指向下一個(gè)空閑空間,確保不越界
}
//判斷隊(duì)列是否為空
bool EmptyQueue(Queue * q)
{
if(q->front==q->rear) //判斷是否為空
{
printf("隊(duì)列已空!\n");
return true;
}
else
return false;
}
//判斷隊(duì)列是否為滿
bool FullQueue(Queue * q)
{
if((q->rear+1)%MAXSIZE==q->front) //判斷循環(huán)鏈表是否滿,留一個(gè)預(yù)留空間不用
{
printf("隊(duì)列已滿!\n");
return true;
}
else
return false;
}
/***********************************************
輸出每一個(gè)元素
************************************************/
void TraverseQueue(Queue * q)
{
int i=q->front;
printf("隊(duì)中的元素是:\n");
while( (i%MAXSIZE)!=q->rear ) //注意,這里沒有加1,打印每一個(gè)元素
{
printf("%c\n ",q->base[i]);
i++;
}
printf("\n");
}
void main()
{
Queue q;
char c;
Queue_Iinit(&q);
printf("請(qǐng)輸入循環(huán)隊(duì)列元素,以#作為結(jié)束符\n");
scanf("%c",&c);//注意!本句表示一次輸入一個(gè)字符
InsertQueue(&q,c);
/*
注意:比如輸入“1110010#”再按下回車鍵,字符串“1110010#”就以一次一個(gè)字符的順序輸入到PC鍵盤緩沖區(qū)即入棧;
出棧時(shí)是以“后進(jìn)先出”的順序出棧,剛好最后入棧的字符就是二進(jìn)制的最低位。對(duì)于棧的操作一定要注意入棧出棧順序
*/
while(c!='#')
{
scanf("%c",&c);//這里為什么還要此句呢?因?yàn)閟canf()一次只能輸入一個(gè)字符,所以必須循環(huán)輸入
InsertQueue(&q,c);
}
getchar();//改變鍵盤輸入緩存指針,即將回車鍵讀出來,這樣可以避免“\r”字符(回車鍵)輸出
TraverseQueue(&q);
printf("開始出隊(duì)命令!\n");
while(1)
{
DeleteQueue(&q,&c);
printf("出隊(duì):%c\n ",c);
if( EmptyQueue( &q))
break;
}
}
///////////////////////////////////----GKXW------------2015年11月14日18:47:4////////////////////////////////////////////////////