【数据结构】郝斌数据结构——笔记05
队列 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]\n", 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]\n", pQueue -> pList[iterator]); break; } printf("%d, ", pQueue -> pList[iterator]); iterator = (iterator + 1) % pQueue -> size; } }