#include"stdio.h"
#include"stdlib.h"
//這是一個靜態隊列的例程
#define MAXSIZE 10 //隊列的最大容量
typedef char ElemType; //定義一個隊列元素類型,這種編程思路很好,程序有擴展空間
//聲明一個有關循環隊列的數據塊,注意每個元素的意義!
struct Queue
{
ElemType *base;//數據類型頭指針
int front; //隊頭(front)進行隊列元素刪除操作的數組指針索引,很巧妙!
int rear; //隊尾(rear)進行隊列元素插入操作的數組指針索引,很巧妙!
};
//創建隊列或曰初始化隊列
void Queue_Iinit(Queue * q)
{
// q= new Queue;
q->base=(ElemType *)malloc(MAXSIZE*sizeof(ElemType));//
if(!q->base)
{
printf("內存分配失敗!\n");
exit(1);
}
q->front=q->rear=0;
//這一步很重要!將隊頭和隊尾指針索引q->front,q->rea都賦值為0,即同時指向數組第一個元素
}
//入隊操作,入隊從隊尾rear處開始
void InsertQueue(Queue * q,ElemType e)
{
if((q->rear+1)%MAXSIZE==q->front)//先判斷隊列是否已滿,因為入隊從隊尾rear處開始,所以先判斷rear指針索引
/*
表達式(q->rear+1)%MAXSIZE也叫取模運算,該表達式能確保(q->rear+1)%MAXSIZE的結果小于MAXSIZE!
這樣可以確保數組指針不越界。為什么要rear加1呢?騰出一個數據的空閑空間。
這種算法很技巧!
*/
{
printf("隊列已滿!\n");
return;
}
q->base[q->rear]=e;//
q->rear=((q->rear+1)%MAXSIZE);//這一步既實現了指針前移同時還實現了指針不越界!技巧!
}
//出隊操作,出隊是從隊頭front處開始
void DeleteQueue(Queue * q,ElemType *e)
{
if(q->front==q->rear)//已空,說明隊列元素已經刪除完畢
{
printf("老大,隊列已空!\n");
return;
}
// *(e++)=q->base[q->front];//完成此步還不夠!還需要指針索引移位!注意賦值方法!
*e=q->base[q->front];//完成此步還不夠!還需要指針索引移位!注意賦值方法!
q->front=(q->front+1)%MAXSIZE; //指針指向下一個空閑空間,確保不越界
}
//判斷隊列是否為空
bool EmptyQueue(Queue * q)
{
if(q->front==q->rear) //判斷是否為空
{
printf("隊列已空!\n");
return true;
}
else
return false;
}
//判斷隊列是否為滿
bool FullQueue(Queue * q)
{
if((q->rear+1)%MAXSIZE==q->front) //判斷循環鏈表是否滿,留一個預留空間不用
{
printf("隊列已滿!\n");
return true;
}
else
return false;
}
/***********************************************
輸出每一個元素
************************************************/
void TraverseQueue(Queue * q)
{
int i=q->front;
printf("隊中的元素是:\n");
while( (i%MAXSIZE)!=q->rear ) //注意,這里沒有加1,打印每一個元素
{
printf("%c\n ",q->base[i]);
i++;
}
printf("\n");
}
void main()
{
Queue q;
char c;
Queue_Iinit(&q);
printf("請輸入循環隊列元素,以#作為結束符\n");
scanf("%c",&c);//注意!本句表示一次輸入一個字符
InsertQueue(&q,c);
/*
注意:比如輸入“1110010#”再按下回車鍵,字符串“1110010#”就以一次一個字符的順序輸入到PC鍵盤緩沖區即入棧;
出棧時是以“后進先出”的順序出棧,剛好最后入棧的字符就是二進制的最低位。對于棧的操作一定要注意入棧出棧順序
*/
while(c!='#')
{
scanf("%c",&c);//這里為什么還要此句呢?因為scanf()一次只能輸入一個字符,所以必須循環輸入
InsertQueue(&q,c);
}
getchar();//改變鍵盤輸入緩存指針,即將回車鍵讀出來,這樣可以避免“\r”字符(回車鍵)輸出
TraverseQueue(&q);
printf("開始出隊命令!\n");
while(1)
{
DeleteQueue(&q,&c);
printf("出隊:%c\n ",c);
if( EmptyQueue( &q))
break;
}
}
///////////////////////////////////----GKXW------------2015年11月14日18:47:4////////////////////////////////////////////////////