21 循环队列

Posted abel2020

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21 循环队列相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>       //exit 函数需要
#include <malloc.h>
#define MAXSIZE 8
typedef struct queue {
    int* arr;      //int 类型数组,arr数组名
    int head;    //队头
    int rear;         //队尾后一个元素
}QUEUE;

//函数原型
bool init_queue(QUEUE* queue);
bool enqueue(QUEUE* queue, int val);   //入队
bool dequeue(QUEUE* queue, int* val); //出队
bool is_empty(QUEUE* queue);
bool is_full(QUEUE* queue);
void show_queue(QUEUE* queue);

//测试程序
main() {
    bool is_em = 1, is_fu = 0;
    QUEUE queue;
    int val;          //出队的int;
    init_queue(&queue);
    enqueue(&queue, -200100);
    enqueue(&queue, 12);
    enqueue(&queue, 13);
    enqueue(&queue, 14);
    enqueue(&queue, 15);
    enqueue(&queue, 116);
    enqueue(&queue, 117);
    enqueue(&queue, 1118);
    enqueue(&queue, 1119);
    enqueue(&queue, 11114);
    show_queue(&queue);
    is_em = is_empty(&queue);
    is_fu = is_full(&queue);
    dequeue(&queue, &val);
    printf("dequeue val=%d", val);
    printf("
is_em=%d,    is_full=%d ", is_em, is_fu);
}
bool init_queue(QUEUE* queue) {
    queue->arr = (int*)malloc(sizeof(int) * MAXSIZE);   // 注意: 是创建int 的存储空间,不是对结构体!
    if (NULL == queue->arr)                    //申请失败
        exit(-1);
    queue->head = 0;                //起始都为0
    queue->rear = 0;
}

bool enqueue(QUEUE* queue, int val) {
    if (is_full(queue))
        return false;
    else
    {
        queue->arr[queue->rear] = val;
        queue->rear = (queue->rear + 1) % MAXSIZE;                 //循环队列队头自加
    }
}

bool dequeue(QUEUE* queue, int* val) {
    if (is_empty(queue))
        return false;
    else {
        *val = queue->arr[queue->head];
        queue->head = (queue->head + 1) % MAXSIZE;     //循环队列队后自加
    }
}

bool is_empty(QUEUE* queue) {
    if (queue->head == queue->rear)                 //如果相等就是空,因为还剩一个空间就是队满了,所以不会和对满冲突
        return true;
    else
        return false;
}


bool is_full(QUEUE* queue) {
    if (queue->head == (queue->rear + 1) % MAXSIZE)        //还剩一个空间就是队满了
        return true;                        //循环队列可以理解为head 在追rear,   rear 在追head
    else
        return false;
}

void show_queue(QUEUE* queue) {
    int i;
    i = queue->head;
    printf("queue:      ");
    while (i != queue->rear) {
        printf("%d ", queue->arr[i]);
        i = (i + 1) % MAXSIZE;
    }
    printf("
");
}

 

以上是关于21 循环队列的主要内容,如果未能解决你的问题,请参考以下文章

# Java 常用代码片段

# Java 常用代码片段

常用python日期日志获取内容循环的代码片段

21个常用代码片段

数据结构-循环队列程序演示

使用从循环内的代码片段中提取的函数避免代码冗余/计算开销