SeqQueue.c 2.7 KB
Newer Older
大熊人's avatar
大熊人 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
/*
 * @Description: 顺序循环队列
 * @Author: 大熊人
 * @LastEditTime: 2020-11-08 18:27:54
 */
#include <stdio.h>
#include <stdlib.h>
#include "includes/SeqQueue.h"

/**
 * @description: 初始化顺序循环队列
 * @param {struct *}Q
 * @return {int}
 */
int InitQueue(SeqQueue *Q)
{
    Q->base = (QUEUE_DATA_TYPE *)malloc(sizeof(QUEUE_DATA_TYPE) * MAXSIZE);
    if (Q->base == NULL)
    {
        return FALSE; //申请内存空失败
    }
    Q->front = 0;
    Q->rear = 0;
    return TRUE;
}

/**
 * @description: 判断队列是否为空
 * @param {struct *}Q
 * @return {int}
 */
int IsEmpty(SeqQueue *Q)
{
    if (QueueLength(Q) == 0)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

/**
 * @description: 判断队列是否满
 * @param {struct *}Q
 * @return {int}
 */
int IsFull(SeqQueue *Q)
{
    if (QueueLength(Q) > 0 && Q->front == Q->rear)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

/**
 * @description: 入列
 * @param {struct *}Q
 * @param {QUEUE_DATA_TYPE *}X
 * @return {int}
 */
int EnQueue(SeqQueue *Q, QUEUE_DATA_TYPE X)
{
    if (IsFull(Q) == TRUE)
    {
        return FALSE; //队列满
    }
    Q->base[Q->rear] = X;
    Q->rear = (Q->rear + 1) % MAXSIZE; //在MAXSIZE范围内指针后移
    return TRUE;
}

/**
 * @description: 出列
 * @param {struct *}Q
 * @param {QUEUE_DATA_TYPE *}X
 * @return {int}
 */
int DeQueue(SeqQueue *Q, QUEUE_DATA_TYPE *X)
{
    if (IsEmpty(Q) == TRUE)
    {
        return FALSE; //队列空
    }
    *X = Q->base[Q->front];
    Q->front = (Q->front + 1) % MAXSIZE; //在MAXSIZE范围内指针后移
    return TRUE;
}

/**
 * @description: 获取队头元素
 * @param {struct *}Q
 * @return {int}
 */
int GetFront(SeqQueue *Q, QUEUE_DATA_TYPE *X)
{
    if (IsEmpty(Q) == TRUE)
    {
        return FALSE;
    }
    *X = Q->base[Q->front];
    return TRUE;
}

/**
 * @description: 获取队列长度
 * @param {struct}Q
 * @return {int}
 */
int QueueLength(SeqQueue *Q)
{
    return (Q->rear - Q->front + MAXSIZE) % MAXSIZE;
}

/**
 * @description: 测试顺序循环队列
 */
void TestSeqQueue()
{
    SeqQueue Q;
    QUEUE_DATA_TYPE value;

    if (InitQueue(&Q))
    {
        printf("初始化成功!\n");
    }
    else
    {
        printf("初始化失败!\n");
    }
    printf("EnQueue:1 %s\n", EnQueue(&Q, 1) ? "TURE" : "FALSE");
    printf("EnQueue:2 %s\n", EnQueue(&Q, 2) ? "TURE" : "FALSE");
    printf("EnQueue:3 %s\n", EnQueue(&Q, 3) ? "TURE" : "FALSE");

    printf("GetFront:%d %s\n", value, GetFront(&Q, &value) ? "TURE" : "FALSE");

    while (DeQueue(&Q, &value))
    {
        printf("DeQueue:%d\n", value);
    }

    printf("GetFront: %s\n", GetFront(&Q, &value) ? "TURE" : "FALSE");

    free(Q.base); //释放申请的内存空间
}