基于循環數組實現的循環隊列
解決了順序隊列中的假溢出導致的空間浪費問題
操作:
(1)初始化
//循環隊列
typedef struct {int *data;//指針模擬聲明數組int head,tail;//隊頭,隊尾
}Queue;
//初始化
Queue *InitQueue()
{Queue *q = (Queue*)malloc(sizeof(Queue));if(q == NULL){printf("內存申請失敗\n");return q;}q->data = (int*)malloc(sizeof(int)*maxx);if(q->data == NULL){printf("數組內存申請失敗\n");free(q);return NULL;}q->head = 0;q->tail = 0;return q;
}
(2)入隊
//入隊
void push(Queue *q,int k)
{if(isFull(q) == 1){printf("隊列已滿\n");return ;}q->data[q->tail] = k;q->tail = (q->tail+1)%maxx;}
(3)出隊
//出隊
void pop(Queue *q)
{if(isEmpty(q) == 1){printf("隊列為空\n");return ;}q->head = (q->head+1) % maxx;
}
(4)判滿
下面呈現的是方案一
還有方案二和方案三:
方案二:新增int len = 0;來標記入隊數據的個數
方案三:加一個標記int flag = 0;入隊標記為1,出隊標記為0,因為隊列剛開始是空的,所以初始值設為0
為什么要這樣做呢?因為判滿和判空的條件重合,都是head == tail來判斷,不好區分。
//判滿(方案一)
int isFull(const Queue *q)
{if(q == NULL){printf("隊列不存在\n");return -1;}if((q->tail+1) % maxx == q->head){return 1;//滿}return 0;//非滿
}
(5)判空
//判空
int isEmpty(const Queue *q)
{if(q == NULL){printf("隊列不存在\n");return -1;}if(q->head == q->tail){return 1;//空}return 0;//非空
}