队列 Queue
定义:
一种可以实现【先进先出】的存储结构
分类:
静态循环队列
链式队列
应用:
与时间相关的操作都与队列有关
算法操作:
入列
出列
操作核心算法:
(尾 + 1)% 长度 == 头
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef enum {
true = 1,
false = 0
} boolean;
typedef struct Queue {
int * pList;
int front;
int rear;
int size;
} * PQUEUE, QUEUE;
void initQueue(PQUEUE pQueue, int size);
boolean isFull(PQUEUE pQueue);
boolean isEmpty(PQUEUE pQueue);
boolean enterQueue(PQUEUE pQueue, int data);
boolean exitQueue(PQUEUE pQueue, int * pData);
void traverseQueue(PQUEUE pQueue);
int main() {
QUEUE queue;
initQueue(&queue, 10);
enterQueue(&queue, 6);
enterQueue(&queue, 12);
enterQueue(&queue, 3);
enterQueue(&queue, 88);
enterQueue(&queue, 43);
traverseQueue(&queue);
int aaa;
exitQueue(&queue, &aaa);
printf("exitValue[%d]
", aaa);
traverseQueue(&queue);
return 0;
}
/**
* 初始化队列,循环队列内核是一个数组,初始化头部尾部位置和大小
* @param pQueue
* @param size
*/
void initQueue(PQUEUE pQueue, int size) {
pQueue -> size = size;
pQueue -> pList = (int *) malloc(sizeof(int) * size);
pQueue -> front = 0;
pQueue -> rear = 0;
}
/**
* 判断满列,尾部索引的下一个位置回到头部就是满了
* @param pQueue
* @return
*/
boolean isFull(PQUEUE pQueue) {
int rear = pQueue -> rear;
int front = pQueue -> front;
int size = pQueue -> size;
return (rear + 1) % size == front;
}
/**
* 判断空列, 头部和尾部相等 就是空列了(初始化状态)
* @param pQueue
* @return
*/
boolean isEmpty(PQUEUE pQueue) {
int rear = pQueue -> rear;
int front = pQueue -> front;
return front == rear;
}
/**
* 入列操作 从尾部装入到头部
* @param pQueue
* @param data
* @return
*/
boolean enterQueue(PQUEUE pQueue, int data) {
if (isFull(pQueue)) return false;
pQueue ->pList[pQueue ->rear] = data;
pQueue ->rear = (pQueue ->rear + 1) % pQueue ->size;
return true;
}
/**
* 出列操作, 从头部出来,头部向前推移,也是缩短队列
* 利用pData参数保存出列的数据
* @param pQueue
* @param pData
* @return
*/
boolean exitQueue(PQUEUE pQueue, int * pData) {
if (isEmpty(pQueue)) return false;
*pData = pQueue ->pList[pQueue ->front];
pQueue ->front = (pQueue ->front + 1) % pQueue ->size;
return true;
}
/**
* 遍历队列
* @param pQueue
*/
void traverseQueue(PQUEUE pQueue) {
if (isEmpty(pQueue)) return;
int iterator = pQueue -> front;
printf("[");
while (iterator != pQueue -> rear) {
if (iterator == pQueue -> rear - 1) {
printf("%d]
", pQueue -> pList[iterator]);
break;
}
printf("%d, ", pQueue -> pList[iterator]);
iterator = (iterator + 1) % pQueue -> size;
}
}