【数据结构】郝斌数据结构——笔记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;
    }
}

  

 

posted @ 2021-04-06 11:52  emdzz  阅读(61)  评论(0编辑  收藏  举报