標籤:迴圈順序隊列的另一種實現方式
上節已經提到有三種方法來實現迴圈順序隊列,其中第一種設立標識不常用,最常的就是後兩種,上一節已經討論了用計數器來實現迴圈順序隊列,這節就用第三種方法,也就是少用一個儲存空間來實現迴圈順序隊列,其基本操作和用計數實作類別同,下面是具體實現:
順序隊列(迴圈隊列)類型描述:
//順序隊列的類型描述#define MAXSIZE 5typedef 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");}}
以上,就是迴圈順序隊列的另一種實現方法,也就是通過少用一個儲存空間,和用計數器實現迴圈順序隊列的主要區別在判斷隊列滿上。
資料結構(C實現)------- 順序隊列(迴圈隊列之少用一個儲存空間實現) .