//循環隊列
/*
循環隊列需要注意的幾點:
1.如果Q->front == Q->rear,則可以判斷隊列爲空
2.如果 (Q->rear+1)%Q->maxsize 則可以判斷隊滿
3.無論是對循環隊列進行插入或者刪除操作,均可能涉及到尾指針或者頭指針的調整
(並且不是簡單對指針進行+1操作)
Q->rear = (Q->rear+1) % Q->queuesize;//入隊
Q->front = (Q->front+1) % Q->queuesize;//出隊
4.循環隊列的長度(Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;
當Q->rear>Q->front時,循環隊列的長度爲Q->rear-Q->front
當Q->rear<Q->front時,循環隊列的長度爲Q->front-Q->front+MAXQSIZE
綜合上述兩種情況,得出循環隊列長度的計算方法
隊列(包括循環隊列)是一個邏輯概念,而鏈表是個存儲概念。一個隊列是否是循環隊列
不取決於它將採用何種存儲結構,根據需要,循環隊列可以採用鏈式存儲結構,
也可以採用鏈式存儲結構(包括循環鏈表)
*/
#include<stdio.h>
#include<malloc.h>
#define MAXQSIZE 50//最大隊列長度
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef int Status;
typedef struct{
ElemType *base;
int front;//頭指針,若隊列不空指向隊頭元素
int rear;//尾指針,若隊列不空指向隊列尾元素的下一個位置
int queuesize;
}SqQueue;
/
函數聲明
/
Status InitQueue(SqQueue Q,int maxsize);
Status EnQueue(SqQueue Q,ElemType e);
Status DeQueue(SqQueue Q);
Status Traverse(SqQueue Q);
/
主函數
/
int main(void){
SqQueue Q;
InitQueue(&Q,MAXQSIZE);
for(int i = 0; i<10; i++){
EnQueue(&Q,i+2);
}
for(int i = 0; i<=10; i++){
DeQueue(&Q);
}
}
/*
函數實現
*/
//初始化隊列
Status InitQueue(SqQueue *Q,int maxsize){
Q->base = (ElemType*)malloc(MAXQSIZE*sizeof(ElemType));
if(!Q){
printf("初始化循環隊列時分配空間失敗!\n");
return ERROR;
}
Q->queuesize = maxsize;
Q->front = Q->rear = 0;
printf("初始化循環隊列成功!\n");
return OK;
}
//入隊
//判斷隊滿的條件:
// 在循環隊列中少用一個空間,噹噹前隊尾指針指向位置+1之後%隊列長度爲隊頭指針位置表示隊滿
Status EnQueue(SqQueue *Q,ElemType e){
if((Q->rear+1) % Q->queuesize == Q->front){
printf("循環隊列隊滿!\n");
return ERROR;
}
Q->base[Q->rear] = e;//將元素插入到隊尾
printf("當前入隊元素:%d\n",Q->base[Q->rear]);
Q->rear = (Q->rear+1) % Q->queuesize;
// Traverse(Q);
return OK;
}
//出隊
Status DeQueue(SqQueue *Q){
//隊列不空,刪除隊頭元素
if(Q->front == Q->rear){
printf("當前隊列爲空,出隊失敗!\n");
return ERROR;
}
ElemType elem;
elem = Q->base[Q->front];
Q->front = (Q->front+1) % Q->queuesize;
printf("當前出隊元素:%d\n",elem);
Traverse(Q);
return OK;
}
Status Traverse(SqQueue *Q){
if(Q->front == Q->rear){
printf("當前隊列爲空!\n");
return ERROR;
}
int p = Q->front;
printf("隊列中的元素:");
while(p != Q->rear){
printf("-[%d]",Q->base[p++]);
}
printf("\n");
return OK;
}