队列

来源:互联网 发布:淘宝拉帮结派流量协议 编辑:程序博客网 时间:2024/06/06 09:07

队列是一种特殊的线性表,只允许在表的前端front进行删除操作,在表的后端rear进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,今次那个删除操作的端称为队头。

基本特征:先进先出(FIFO)

基本操作:压入,弹出

实现要点:初始化空间,前指针front弹出后指针rear压入,循环使用,判空判满

举例1:基于数组的队列

//队列typedef struct Queue{    int *array;    size_t cap;    size_t front;    size_t rear;    size_t size;} Myqueue;

//分配内存并初始化为空队列void queueInit(Myqueue *queue,size_t cap){    queue->array = malloc(cap *sizeof(int));    queue->cap = cap;    queue->front = 0;    queue->rear = 0;    queue->size = 0;}//释放内存并恢复到初始状态void queueDestroy(Myqueue *queue){    free(queue->array);    queue->array = NULL;    queue->cap = 0;    queue->front = 0;    queue->rear = 0;    queue->size = 0;}//判满int queueFull(Myqueue *queue){    return queue->size >= queue->cap;}//判空int queueEmpty(Myqueue *queue){    return ! queue->size;}//压入void queuePush(Myqueue *queue,int data){    if (queue->rear >= queue->cap) {        queue->rear = 0;    }    ++ queue->size;    queue->array[queue->rear ++] = data;}//弹出int queuePop(Myqueue *queue){    if (queue->front >= queue->cap) {        queue->front = 0;    }    -- queue->size;    return queue->array[queue->front ++];}//队首int queueFront(Myqueue *queue){    if (queue->front >= queue->cap) {        queue->front = 0;    }    return queue->array[queue->front];}//数量size_t queueSize(Myqueue *queue){    return queue->size;}

int main(){    Myqueue *queue;    queueInit(queue, 4);    queuePush(queue, 50);    queuePush(queue, 60);    queuePush(queue, 70);    queuePush(queue, 80);    printf("%s\r\n",queueFull(queue) ? "full" : "empty");        printf("%d\r\n",queuePop(queue));    printf("%d\r\n",queuePop(queue));    queuePush(queue, 90);    queuePush(queue, 100);    printf("%d\r\n",queuePop(queue));    printf("%d\r\n",queuePop(queue));    printf("%d\r\n",queuePop(queue));    printf("%d\r\n",queuePop(queue));    queueDestroy(queue);    return 0;    }

0 0
原创粉丝点击