基于顺序存储的环形队列算法库构建

学习贺利坚老师基于数组的环形队列

数据结构之自建算法库——顺序环形队列_下空队列q中依次入队列数据元素abc-CSDN博客

本人详细引入博客

队列的定义-CSDN博客

本人详细讲解博客

队列的顺序存储结构-CSDN博客

环形队列引入详细讲解

环形队列的存储及基本操作_环形队列基本操作-CSDN博客

v2.0升级版本详细博客

拓展 : 环形队列的另一种设计_环形队列中有多少个元素可以根据队首指针和队尾指针的值来计算。-CSDN博客

版本更新日志

v1.0: 基于之前的逻辑框架 , 简单改名, 易于理解

v2.0: 基于第一种框架, 通过 队首尾指针进行指引的方式, 不能直接判断元素个数, 所以通过增加元素个数选项, 来提升队列可操作性

V1.0

算法库函数

//(1) 初始化顺序的循环队列
void Init_Sequential_circular_queue(Sequential_circular_queue *&init_queue);
//(2) 销毁顺序的循环队列
void Destroy_Sequential_circular_queue(Sequential_circular_queue *&destroy_queue);
//(3) 判断顺序循环队列是否为空
bool IsEmpty_Sequential_circular_queue(Sequential_circular_queue *judge_queue);
//(4) 测算循环队列的元素个数
int Length_Sequential_circular_queue(Sequential_circular_queue *measure_queue);
//(5) 入队元素
bool Enter_Sequential_circular_queue(Sequential_circular_queue *&enter_queue, ElemType enter_value);
//(6) 出队元素
bool Out_Sequential_circular_queue(Sequential_circular_queue *&Out_queue, ElemType &Out_value);

头文件

Sequential_circular_queue.h

#ifndef SEQUENTIAL_CIRCULAR_QUEUE_H_INCLUDED

#define SEQUENTIAL_CIRCULAR_QUEUE_H_INCLUDED

#define   MaxSize 8      //数组长度

typedef char ElemType;//自定义队列类型

//数组循环队列,自定义结构体
typedef struct
{
    ElemType data[MaxSize];//存储队列数据
    int Front;//队首指针
    int Rear;//队尾指针

}Sequential_circular_queue;

//(1) 初始化顺序的循环队列
void Init_Sequential_circular_queue(Sequential_circular_queue *&init_queue);
//(2) 销毁顺序的循环队列
void Destroy_Sequential_circular_queue(Sequential_circular_queue *&destroy_queue);
//(3) 判断顺序循环队列是否为空
bool IsEmpty_Sequential_circular_queue(Sequential_circular_queue *judge_queue);
//(4) 测算循环队列的元素个数
int Length_Sequential_circular_queue(Sequential_circular_queue *measure_queue);
//(5) 入队元素
bool Enter_Sequential_circular_queue(Sequential_circular_queue *&enter_queue, ElemType enter_value);
//(6) 出队元素
bool Out_Sequential_circular_queue(Sequential_circular_queue *&Out_queue, ElemType &Out_value);

#endif //SEQUENTIAL_CIRCULAR_QUEUE_H_INCLUDE

库函数实现

Sequential_circular_queue.cpp

/*****************************************
功  能: 基于顺序存储的环形队列
编程人: 王涛
时  间: 2024.6.22
版  本: V1.0
******************************************/
#include <stdio.h>
#include <malloc.h>
#include "Sequential_circular_queue.h"

/**************************************************
(1)函数名: Init_Sequential_circular_queue
功  能: 初始创建的顺序循环队列
参  数: (1)Sequential_circular_queue *&init_queue:要初始化的顺序队列
返回值: 无
**************************************************/

void Init_Sequential_circular_queue(Sequential_circular_queue *&init_queue)
{
    init_queue = (Sequential_circular_queue*)malloc(sizeof(Sequential_circular_queue));
    init_queue->Front = 0;
    init_queue->Rear = 0;
}

/**************************************************
(2)函数名: Destroy_Sequential_circular_queue
功  能: 销毁顺序存储的循环队列
参  数: (1)Sequential_circular_queue *&destroy_queue: 要销毁的队列
注  意: 传入的是 *& 指针地址, 所以可以修改原函数
返回值: 无(只有成功,没有失败)
**************************************************/
void Destroy_Sequential_circular_queue(Sequential_circular_queue *&destroy_queue)
{
    free(destroy_queue);
}

/**************************************************
(3)函数名: IsEmpty_Sequential_circular_queue
功  能: 判断顺序循环队列是否为空
参  数: Sequential_circular_queue *&judge_queue:要判断的
返回值: bool:判断是队列是否为空
**************************************************/
bool IsEmpty_Sequential_circular_queue(Sequential_circular_queue *judge_queue)
{
    //队首,队尾重合,则队列为空
    return (judge_queue->Front == judge_queue->Rear);
}

/**************************************************
(4)函数名: Length_Sequential_circular_queue
功  能: 测算循环队列的元素个数
参  数: Sequential_circular_queue *&measure_queue:要进行测量元素个数的队列
返回值: int: 返回队列元素个数/长度
**************************************************/
int Length_Sequential_circular_queue(Sequential_circular_queue *measure_queue)
{
    return (measure_queue->Rear - measure_queue->Front+MaxSize)%MaxSize;
}

/**************************************************
(5)函数名: Enter_Sequential_circular_queue
功  能:入队元素
参  数:(1)Sequential_circular_queue *&enter_queue:入队元素的队列
       (2)ElemType enter_value:入队的元素值
返回值:bool: 是否队满? 是,成功:否,失败
**************************************************/
bool Enter_Sequential_circular_queue(Sequential_circular_queue *&enter_queue, ElemType enter_value)
{
    //判断防止队满上溢
    if((enter_queue->Rear+1)%MaxSize == enter_queue->Front)
    {
        return false;
    }
    enter_queue->Rear = (enter_queue->Rear + 1)%MaxSize;
    enter_queue->data[enter_queue->Rear] = enter_value;
    return true;
}

/**************************************************
函数名: Out_Sequential_circular_queue
功  能:出队元素
参  数:(1)Sequential_circular_queue *&Out_queue:出队队列
        (2)ElemType &Out_value:出队队列元素值
注  意: 出队队列,要进行修改,所以是*&(指针地址)
        并且要传回出队元素的数值,所以也用的是 &(地址)
返回值: bool: 出队成功? 队非空,成功:队空,失败
**************************************************/
bool Out_Sequential_circular_queue(Sequential_circular_queue *&Out_queue, ElemType &Out_value)
{
    if(IsEmpty_Sequential_circular_queue(Out_queue))//判断为空,则跳出
    {
        return false;
    }
    Out_queue->Front = (Out_queue->Front + 1)%MaxSize; //锁定出队元素序号
    Out_value = Out_queue->data[Out_queue->Front];//传回出队数值
    return true;
}



主函数测试

main.cpp

#include <stdio.h>
#include "Sequential_circular_queue.h"

int main()
{
    ElemType test_data1;
    Sequential_circular_queue *test_queue1;
    printf("(1)初始化队列test_queue1\n");
    Init_Sequential_circular_queue(test_queue1);
    printf("(2)依次进队列元素 a b c \n");
    if(Enter_Sequential_circular_queue(test_queue1,'a') == 0)
    {
        printf("\n队满, 不能进队!\n");
    }
    if(Enter_Sequential_circular_queue(test_queue1,'b') == 0)
    {
        printf("\n队满, 不能进队!\n");
    }
    if(Enter_Sequential_circular_queue(test_queue1,'c') == 0)
    {
        printf("\n队满, 不能进队!\n");
    }

    printf("\n(3)队列为%s\n",(IsEmpty_Sequential_circular_queue(test_queue1)?"空":"非空"));


    if(Out_Sequential_circular_queue(test_queue1, test_data1) == 0)
    {
        printf("队空, 不能出队\n");
    }
    else
    {
        printf("(4)出队一个元素 %c \n", test_data1);
    }
    printf("(5)队列test_queue1的元素个数:%d\n", Length_Sequential_circular_queue(test_queue1));
    printf("(6) 依次进队列元素 d e f\n");

    test_data1 = 'd';
    if(Enter_Sequential_circular_queue(test_queue1, test_data1) == 0)
    {
        printf("\n队满,%c不能进队\n",test_data1);
    }
    test_data1 = 'e';
    if(Enter_Sequential_circular_queue(test_queue1, test_data1) == 0)
    {
        printf("\n队满,%c不能进队\n",test_data1);
    }
    test_data1 = 'f';
    if(Enter_Sequential_circular_queue(test_queue1, test_data1) == 0)
    {
        printf("\n队满,%c不能进队\n",test_data1);
    }
    printf("\n(7) 队列test1的元素个数是%d\n", Length_Sequential_circular_queue(test_queue1));
    printf("(8)出队列序号:");
    while(!IsEmpty_Sequential_circular_queue(test_queue1))
    {
        Out_Sequential_circular_queue(test_queue1,test_data1);
        printf("\n%c\n",test_data1);
    }
    printf("\n");
    printf("(9)释放队列\n");
    Destroy_Sequential_circular_queue(test_queue1);
    return 0;

}

运行结果

V2.0

算法库函数

//(1) 初始化顺序的循环队列
void Init_Sequential_circular_queue(Sequential_circular_queue *&init_queue);
//(2) 销毁顺序的循环队列
void Destroy_Sequential_circular_queue(Sequential_circular_queue *&destroy_queue);
//(3) 判断顺序循环队列是否为空
bool IsEmpty_Sequential_circular_queue(Sequential_circular_queue *judge_queue);
//(4) 判断顺序循环队列是否队满
bool IsFull_Sequential_circular_queue(Sequential_circular_queue *judge_queue);
//(5) 测算循环队列的元素个数
int Length_Sequential_circular_queue(Sequential_circular_queue *measure_queue);
//(6) 入队元素
bool Enter_Sequential_circular_queue(Sequential_circular_queue *&enter_queue, ElemType enter_value);
//(7) 出队元素
bool Out_Sequential_circular_queue(Sequential_circular_queue *&Out_queue, ElemType &Out_value);

头文件

Sequential_circular_queue.h

#ifndef SEQUENTIAL_CIRCULAR_QUEUE_H_INCLUDED

#define SEQUENTIAL_CIRCULAR_QUEUE_H_INCLUDED

#define   MaxSize 8      //数组长度

typedef char ElemType;//自定义队列类型

//数组循环队列,自定义结构体
typedef struct
{
    ElemType data[MaxSize];//存储队列数据
    int Front;//队首指针
    int element_count;

}Sequential_circular_queue;

//(1) 初始化顺序的循环队列
void Init_Sequential_circular_queue(Sequential_circular_queue *&init_queue);
//(2) 销毁顺序的循环队列
void Destroy_Sequential_circular_queue(Sequential_circular_queue *&destroy_queue);
//(3) 判断顺序循环队列是否为空
bool IsEmpty_Sequential_circular_queue(Sequential_circular_queue *judge_queue);
//(4) 判断顺序循环队列是否队满
bool IsFull_Sequential_circular_queue(Sequential_circular_queue *judge_queue);
//(5) 测算循环队列的元素个数
int Length_Sequential_circular_queue(Sequential_circular_queue *measure_queue);
//(6) 入队元素
bool Enter_Sequential_circular_queue(Sequential_circular_queue *&enter_queue, ElemType enter_value);
//(7) 出队元素
bool Out_Sequential_circular_queue(Sequential_circular_queue *&Out_queue, ElemType &Out_value);

#endif //SEQUENTIAL_CIRCULAR_QUEUE_H_INCLUDE

库函数实现

Sequential_circular_queue.cpp

/*****************************************
功  能: 基于顺序存储的环形队列(通过记录队头和元素个数)
编程人: 王涛
时  间: 2024.6.23
版  本: V2.0
******************************************/
#include <stdio.h>
#include <malloc.h>
#include "Sequential_circular_queue.h"

/**************************************************
(1)函数名: Init_Sequential_circular_queue
功  能: 初始创建的顺序循环队列
参  数: (1)Sequential_circular_queue *&init_queue:要初始化的顺序队列
返回值: 无
**************************************************/

void Init_Sequential_circular_queue(Sequential_circular_queue *&init_queue)
{
    init_queue = (Sequential_circular_queue*)malloc(sizeof(Sequential_circular_queue));
    init_queue->Front = 0;
    init_queue->element_count = 0;
}

/**************************************************
(2)函数名: Destroy_Sequential_circular_queue
功  能: 销毁顺序存储的循环队列
参  数: (1)Sequential_circular_queue *&destroy_queue: 要销毁的队列
注  意: 传入的是 *& 指针地址, 所以可以修改原函数
返回值: 无(只有成功,没有失败)
**************************************************/
void Destroy_Sequential_circular_queue(Sequential_circular_queue *&destroy_queue)
{
    free(destroy_queue);
}

/**************************************************
(3)函数名: IsEmpty_Sequential_circular_queue
功  能: 判断顺序循环队列是否为空
参  数: Sequential_circular_queue *&judge_queue:要判断的队列
返回值: bool:判断是队列是否为空
**************************************************/
bool IsEmpty_Sequential_circular_queue(Sequential_circular_queue *judge_queue)
{
    //队首,队尾重合,则队列为空
    return (judge_queue->element_count == 0);
}

/**************************************************
(4)函数名: IsFull_Sequential_circular_queue
功  能: 判断队列是否队满溢出
参  数: Sequential_circular_queue *judge_queue:要进行判断的队列
返回值: bool: 是否队满? true,队满:false,不满
**************************************************/
bool IsFull_Sequential_circular_queue(Sequential_circular_queue *judge_queue)
{
    //满队返回true
    return (judge_queue->element_count == MaxSize);
}


/**************************************************
(5)函数名: Length_Sequential_circular_queue
功  能: 测算循环队列的元素个数
参  数: Sequential_circular_queue *&measure_queue:要进行测量元素个数的队列
返回值: int: 返回队列元素个数/长度
**************************************************/
int Length_Sequential_circular_queue(Sequential_circular_queue *measure_queue)
{
    return (measure_queue->element_count);
}

/**************************************************
(6)函数名: Enter_Sequential_circular_queue
功  能:入队元素
参  数:(1)Sequential_circular_queue *&enter_queue:入队元素的队列
       (2)ElemType enter_value:入队的元素值
返回值:bool: 是否队满? 是,成功:否,失败
**************************************************/
bool Enter_Sequential_circular_queue(Sequential_circular_queue *&enter_queue, ElemType enter_value)
{
    //进队要用到rear,我们之前没有定义,所以这里定义临时用一下
    int rear;
    //判断防止队满上溢
    if(IsFull_Sequential_circular_queue(enter_queue))
    {
        return false;
    }
    //不满则把尾指针算出,然后指针后移以为,插入新元素,队元素加一
    rear = (enter_queue->Front + enter_queue->element_count)%MaxSize;
    //尾指针后移
    rear = (rear+1)%MaxSize;
    //插入新元素
    enter_queue->data[rear] = enter_value;
    //队元素个数加一
    enter_queue->element_count++;
    return true;
}

/**************************************************
(7)函数名: Out_Sequential_circular_queue
功  能:出队元素
参  数:(1)Sequential_circular_queue *&Out_queue:出队队列
        (2)ElemType &Out_value:出队队列元素值
注  意: 出队队列,要进行修改,所以是*&(指针地址)
        并且要传回出队元素的数值,所以也用的是 &(地址)
返回值: bool: 出队成功? 队非空,成功:队空,失败
**************************************************/
bool Out_Sequential_circular_queue(Sequential_circular_queue *&Out_queue, ElemType &Out_value)
{
    if(IsEmpty_Sequential_circular_queue(Out_queue))//判断为空,则跳出
    {
        return false;
    }
    //队列不空,则队首指针向后位移一位,然后传出元素,队列元素个数减去1

    Out_queue->Front = (Out_queue->Front + 1)%MaxSize; //锁定出队元素序号

    Out_value = Out_queue->data[Out_queue->Front];//传回出队数值

    Out_queue->element_count--; //队列个数减去1

    return true;    //出队成功返回true
}

主函数测试

main.cpp

#include <stdio.h>
#include "Sequential_circular_queue.h"

int main()
{
    ElemType test_data1;
    Sequential_circular_queue *test_queue1;
    printf("(1)初始化队列test_queue1\n");
    Init_Sequential_circular_queue(test_queue1);
    printf("(2)依次进队列元素 h i j \n");
    if(Enter_Sequential_circular_queue(test_queue1,'h') == 0)
    {
        printf("\n队满, 不能进队!\n");
    }
    if(Enter_Sequential_circular_queue(test_queue1,'i') == 0)
    {
        printf("\n队满, 不能进队!\n");
    }
    if(Enter_Sequential_circular_queue(test_queue1,'j') == 0)
    {
        printf("\n队满, 不能进队!\n");
    }

    printf("\n(3)队列为%s\n",(IsEmpty_Sequential_circular_queue(test_queue1)?"空":"非空"));


    if(Out_Sequential_circular_queue(test_queue1, test_data1) == 0)
    {
        printf("队空, 不能出队\n");
    }
    else
    {
        printf("(4)出队一个元素 %c \n", test_data1);
    }
    printf("(5)队列test_queue1的元素个数:%d\n", Length_Sequential_circular_queue(test_queue1));
    printf("(6) 依次进队列元素 k l m\n");

    test_data1 = 'k';
    if(Enter_Sequential_circular_queue(test_queue1, test_data1) == 0)
    {
        printf("\n队满,%c不能进队\n",test_data1);
    }
    test_data1 = 'l';
    if(Enter_Sequential_circular_queue(test_queue1, test_data1) == 0)
    {
        printf("\n队满,%c不能进队\n",test_data1);
    }
    test_data1 = 'm';
    if(Enter_Sequential_circular_queue(test_queue1, test_data1) == 0)
    {
        printf("\n队满,%c不能进队\n",test_data1);
    }
    printf("\n(7) 队列test1的元素个数是%d\n", Length_Sequential_circular_queue(test_queue1));
    printf("(8)出队列序号:");
    while(!IsEmpty_Sequential_circular_queue(test_queue1))
    {
        Out_Sequential_circular_queue(test_queue1,test_data1);
        printf("\n%c\n",test_data1);
    }
    printf("\n");
    printf("(9)释放队列\n");
    Destroy_Sequential_circular_queue(test_queue1);
    return 0;

}

运行结果:

  • 17
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于C语言环形队列算法实现: ``` #include <stdio.h> #include <stdlib.h> #define QUEUE_SIZE 5 typedef struct { int *arr; // 队列数据存储数组 int front; // 队首指针 int rear; // 队尾指针 int size; // 队列元素个数 } CircularQueue; // 初始化队列 void initQueue(CircularQueue *q) { q->arr = (int*)malloc(QUEUE_SIZE * sizeof(int)); q->front = 0; q->rear = 0; q->size = 0; } // 判断队列是否为空 int isEmpty(CircularQueue *q) { return q->size == 0; } // 判断队列是否已满 int isFull(CircularQueue *q) { return q->size == QUEUE_SIZE; } // 入队 void enqueue(CircularQueue *q, int val) { if (isFull(q)) { printf("Queue is full. Enqueue failed.\n"); return; } q->arr[q->rear] = val; q->rear = (q->rear + 1) % QUEUE_SIZE; q->size++; } // 出队 int dequeue(CircularQueue *q) { if (isEmpty(q)) { printf("Queue is empty. Dequeue failed.\n"); return -1; } int val = q->arr[q->front]; q->front = (q->front + 1) % QUEUE_SIZE; q->size--; return val; } // 获取队列长度 int getSize(CircularQueue *q) { return q->size; } // 打印队列元素 void printQueue(CircularQueue *q) { if (isEmpty(q)) { printf("Queue is empty. No element to print.\n"); return; } printf("Queue elements: "); for (int i = q->front; i != q->rear; i = (i + 1) % QUEUE_SIZE) { printf("%d ", q->arr[i]); } printf("\n"); } int main() { CircularQueue q; initQueue(&q); enqueue(&q, 1); enqueue(&q, 2); enqueue(&q, 3); enqueue(&q, 4); enqueue(&q, 5); printQueue(&q); dequeue(&q); dequeue(&q); printQueue(&q); enqueue(&q, 6); enqueue(&q, 7); printQueue(&q); return 0; } ``` 这个实现中,定义了一个`CircularQueue`结构体表示环形队列。在初始化队列时,动态分配一个数组来存储队列元素,并将队首、队尾指针和队列元素个数初始化为0。入队时,先判断队列是否已满,如果已满则提示失败;否则将新元素插入队尾,并将队尾指针向后移动一个位置(如果到达数组末尾则回到数组头),同时队列元素个数加1。出队时,先判断队列是否为空,如果为空则提示失败;否则取出队首元素,将队

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值