循環隊列

//循環隊列
/*
循環隊列需要注意的幾點:
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章