隊列的描述
隊列的主要特徵是先進先出(FIFO),這意味着先進入隊列的元素將會首先出隊,與生活中的排隊一樣。
循環隊列
爲了更好的利用資源,在編程時,經常把隊列實現爲循環隊列(不懂自行百度,太多講解了)。
注:在循環隊列中空和滿的條件需要注意,本文實例採用犧牲一個位置的實現方式。
循環隊列接口定義
int initQueue(queueT *queue, int size); /* 初始化隊列,size爲隊列長度 */
int destroyQueue(queueT *queue); /* 銷燬隊列 */
int queueIsEmpty(queueT *queue); /* 隊列是否爲空 */
int queueIsFull(queueT *queue); /* 隊列是否爲滿 */
int enqueue(queueT *queue, queueElementT element); /* 入隊 */
int dequeue(queueT *queue, queueElementT *element); /* 出隊 */
void queueTraverse(queueT *queue); /* 遍歷打印隊列中元素 */
循環隊列實現
< queue.h >
#ifndef __QUEUE_H__
#define __QUEUE_H__
typedef int queueElementT;
typedef struct {
int head;
int rear;
int size;
queueElementT *contents;
}queueT;
int initQueue(queueT *queue, int size); /* 初始化隊列,size爲隊列長度 */
int destroyQueue(queueT *queue); /* 銷燬隊列 */
int queueIsEmpty(queueT *queue); /* 隊列是否爲空 */
int queueIsFull(queueT *queue); /* 隊列是否爲滿 */
int enqueue(queueT *queue, queueElementT element); /* 入隊 */
int dequeue(queueT *queue, queueElementT *element); /* 出隊 */
void queueTraverse(queueT *queue); /* 遍歷打印隊列中元素 */
#endif
< queue.c >
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
int initQueue(queueT *queue, int size)
{
queue->contents = (queueElementT *)malloc(sizeof(queueElementT) * (size + 1)); //由於犧牲了一個位置,所以分配時多分配一個位置
if(queue->contents == NULL) {
perror("malloc");
return -1;
}
queue->head = 0;
queue->rear = 0;
queue->size = size + 1;
return 0;
}
int destroyQueue(queueT *queue)
{
free(queue->contents);
queue->contents = NULL;
}
int queueIsEmpty(queueT *queue)
{
if(queue->head == queue->rear) {
return 1;
}
return 0;
}
int queueIsFull(queueT *queue)
{
if(((queue->rear + 1) % queue->size) == queue->head) {
return 1;
}
return 0;
}
int enqueue(queueT *queue, queueElementT element)
{
if(queueIsFull(queue)) {
printf("queue is full\n");
return -1;
}
queue->contents[queue->rear % queue->size] = element;
queue->rear = (queue->rear + 1) % queue->size;
return 0;
}
int dequeue(queueT *queue, queueElementT *element)
{
if(queueIsEmpty(queue)) {
printf("queue is empty\n");
return -1;
}
*element = queue->contents[queue->head % queue->size];
queue->head = (queue->head + 1) % queue->size;
return 0;
}
void queueTraverse(queueT *queue)
{
int i;
if(queueIsEmpty(queue)) {
printf("queue is empty\n");
return;
}
i = queue->head;
while(1) {
printf("%d\n", queue->contents[i]);
if((i + 1) % queue->size == queue->rear) {
break;
}
i = (i + 1) % queue->size;
}
}
github地址(含Makefile和測試代碼)
https://github.com/zsirkg/myWorks/tree/master/algorithms_and_data_structures/queue/array