线性队列和线性堆栈有点相似,但队列里面的数据是“先进先出”。实际应用时大多是采用循环队列,关于队列的循环实现,需要两件事情要警惕:1、检测队列是否为空;2、检测队列是否已满。下面就简单的介绍循环队列的一些基本操作
1、队列的数据节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| typedef struct _Queue { int *pData; int capacity; int front; int rear; int count; }Queue; 2、创建指定容量队列 Queue* createQueue(int num) { Queue *pQueue = NULL; if (0 == num) return NULL;
4、入队列 线性循环队列等效认为数据域是一个环的数组空间,这样在入队列的时候,队列尾位置(实际上队列并没有严格的首尾之分)为(rear + 1) mod capacity。而不是简单的进行加1处理
pQueue = (Queue *)malloc(sizeof(Queue)); assert(NULL != pQueue); memset(pQueue, 0, sizeof(Queue)); pQueue->pData = (int *)malloc(sizeof(int)* num); if (NULL == pQueue->pData) { free(pQueue); pQueue = NULL; return NULL; } pQueue->capacity = num; return pQueue;
}
|
3、判断队列空,满
1 2 3 4 5 6 7 8 9
| bool isFull(Queue *pQueue) { return (pQueue->count == pQueue->capacity); }
bool isEmpty(Queue *pQueue) { return (0 == pQueue->count); }
|
4、入队列
线性循环队列等效认为数据域是一个环的数组空间,这样在入队列的时候,队列尾位置(实际上队列并没有严格的首尾之分)为(rear + 1) mod capacity。而不是简单的进行加1处理
4、入队列
线性循环队列等效认为数据域是一个环的数组空间,这样在入队列的时候,队列尾位置(实际上队列并没有严格的首尾之分)为(rear + 1) mod capacity。而不是简单的进行加1处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| bool enQueue(Queue *pQueue, int value) { if (NULL == pQueue) return false;
if (isFull(pQueue)) return false; pQueue->pData[pQueue->rear] = value; pQueue->rear = (pQueue->rear + 1) % pQueue->capacity; pQueue->count++; return true;
}
|
5、出队列
5、出队列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| bool deQueue(Queue *pQueue, int *value) { if (NULL == pQueue) return false;
if (isEmpty(pQueue)) return false; *value = pQueue->pData[pQueue->front]; pQueue->count--; pQueue->front = (pQueue->front + 1) % pQueue->capacity; return true;
}
|
了解队列的特点,出队列的时候,是弹出队列前端数据
6、释放队列
了解队列的特点,出队列的时候,是弹出队列前端数据
6、释放队列
采用二级指针传递是在释放内存后,将队列指针设置为NULL,便于之后的基本操作的参数判断。使用一级指针也可释放内存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| bool freeQueue(Queue **ppQueue) { if ((NULL == ppQueue) || (NULL == *ppQueue)) return false;
if (NULL == (*ppQueue)->pData) { free(*ppQueue); *ppQueue = NULL; return true; } free((*ppQueue)->pData); (*ppQueue)->pData = NULL; free(*ppQueue); *ppQueue = NULL; return true;
}
|
7、打印队列数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| void printQueue(Queue *pQueue) { if (pQueue) { int i = pQueue->front; int cnt = pQueue->count; while (0 != cnt) { printf("%d\n", pQueue->pData[(i++) % pQueue->capacity]); --cnt; }
return; }
} 设计循
|
环队列数据结构比较简单,需要注意的就是数据域循环的“环”的处理。