上節已經提到有三種方法來實現循環順序隊列,其中第一種設立標識不常用,最常的就是後兩種,上一節已經討論了用計數器來實現循環順序隊列,這節就用第三種方法,也就是少用一個存儲空間來實現循環順序隊列,其基本操作和用計數實現類同,下面是具體實現:
//順序隊列的類型描述 #define MAXSIZE 5 typedef int ElemType; typedef struct{ ElemType *data; int front,rear; }SqQueue;
1. 初始化順序隊列(循環隊列) Init_SqQueue(SqQueue* Q)
void Init_SqQueue(SqQueue* Q){ Q->data = (SqQueue*)malloc(sizeof(SqQueue) * MAXSIZE); Q->front = Q->rear = 0; }
2. 銷毀順序隊列(循環隊列)Destroy_SqQueue(SqQueue* Q)
void Destroy_SqQueue(SqQueue* Q){ if(Q->data){ free(Q->data); Q->front = Q->rear = 0; } }
3. 清空順序隊列(循環隊列)Clear_SqQueue(SqQueue* Q)
void Clear_SqQueue(SqQueue* Q){ Q->front = Q->rear = 0; }
4. 判斷順序隊列(循環隊列)是否為空IsEmpty_SqQueue(SqQueue* Q)
int IsEmpty_SqQueue(SqQueue* Q){ return (Q->rear == Q->front); }
5. 判斷順序隊列(循環隊列)是否已滿 iSFull_SqQueue(SqQueue* Q)
int iSFull_SqQueue(SqQueue* Q){ return ((Q->rear + 1) % MAXSIZE == Q->front); }
6. 求得順序隊列(循環隊列)的長度GetLength_SqQueue(SqQueue* Q)
int GetLength_SqQueue(SqQueue* Q){ return (Q->rear - Q->front + MAXSIZE) % MAXSIZE; }
7. 取得順序隊列(循環隊列)的的隊頭GetHead_SqQueue(SqQueue* Q,ElemType *x)
void GetHead_SqQueue(SqQueue* Q,ElemType *x){ if(IsEmpty_SqQueue(Q)){ printf("順序隊列空!\n"); exit(0); } else{ *x = Q->data[Q->front]; } }
8. 取得順序隊列(循環隊列)的的隊尾GetRear_SqQueue(SqQueue* Q,ElemType *x
void GetRear_SqQueue(SqQueue* Q,ElemType *x){ if(IsEmpty_SqQueue(Q)){ printf("順序隊列空!\n"); exit(0); } else{ *x = Q->data[(Q->rear - 1 + MAXSIZE) % MAXSIZE]; } }
9. 入順序隊列(循環隊列)En_SqQueue(SqQueue* Q,ElemType x)
void En_SqQueue(SqQueue* Q,ElemType x){ if(iSFull_SqQueue(Q)){ printf("順序隊列已滿!\n"); exit(0); } else{ Q->data[Q->rear] = x; Q->rear = (Q->rear + 1) % MAXSIZE; } }
10. 出順序隊列(循環隊列)De_SqQueue(SqQueue* Q,ElemType *x)
void De_SqQueue(SqQueue* Q,ElemType *x){ if(IsEmpty_SqQueue(Q)){ printf("順序隊列空!\n"); exit(0); } else{ *x = Q->data[Q->front]; Q->front = (Q->front + 1) % MAXSIZE; } }
11. 打印順序隊列(循環隊列)Print_SqQueue(SqQueue* Q)
void Print_SqQueue(SqQueue* Q){ int i = 0; int j = Q->front; if(IsEmpty_SqQueue(Q)){ printf("順序隊列空!\n"); exit(0); } else{ while(i < GetLength_SqQueue(Q)){ printf("%d\t",Q->data[j]); j = (j + 1) % MAXSIZE; i++; } printf("\n"); } }
以上,就是循環順序隊列的另一種實現方法,也就是通過少用一個存儲空間,和用計數器實現循環順序隊列的主要區別在判斷隊列滿上。