C语言环形队列

#include <stdio.h>
#define Len 6
unsigned char Input_Buff[6] = {0}; //用户输入缓冲区
unsigned char Input_Num  = 0;      //输入队列数据字节数
unsigned char Output_Num = 0;      //从队列取出的数据字节数
struct Queue
{
    unsigned char  Buffer[Len]; 
    unsigned char* Head;
    unsigned char* Tail;
};
Queue Ring_Queue;
void Empty() { //清空队列
    Ring_Queue.Head = Ring_Queue.Buffer;//Buffer缓冲区数组
    Ring_Queue.Tail = Ring_Queue.Buffer;
}

void Write(unsigned char* pData, unsigned char Data_Len) {  //入队列
    for (unsigned char Data_Num = 0; Data_Num < Data_Len; Data_Num++) {
        Ring_Queue.Buffer[Ring_Queue.Tail - Ring_Queue.Buffer] = *pData;
        pData++; 
        Ring_Queue.Tail++; //尾指针指向写入数据的末端
        if (Ring_Queue.Tail == Ring_Queue.Buffer + Len) {
            Ring_Queue.Tail = Ring_Queue.Buffer;
        }
        if (Ring_Queue.Head == Ring_Queue.Tail) { //不覆盖旧数据
            return;
        }
        printf("\n\r");
    }
}


void Read(unsigned char Read_Len) { //从队列中取出
    unsigned char Result = 0;
    for (unsigned char Read_Num = 0; Read_Num < Read_Len; Read_Num++) {
        Result = *(Ring_Queue.Head); //头指针指向读出数据后队列中剩余数据的开头
        *(Ring_Queue.Head) = NULL;
        printf("%hhu\n\r", Result);
        Ring_Queue.Head++;
        if (Ring_Queue.Head == Ring_Queue.Buffer + Len) {
            Ring_Queue.Head = Ring_Queue.Buffer;
        }
    }
    printf("\n\r");
}
void Key_Input() {
    printf("输入数据:\n\r");
    for (unsigned char Scanf_Num = 0; Scanf_Num < 6; Scanf_Num++) {
        scanf_s(" %hhu", &Input_Buff[Scanf_Num]);  //注意%hhu前的空格
    }
    printf("输入长度:\n\r");
    scanf_s("%hhu", &Input_Num);
    printf("读取长度:\n\r");
    scanf_s("%hhu", &Output_Num);
}
int main() {
    Empty();
    while (1) {
        Key_Input();
        Write(Input_Buff, Input_Num);
        Read(Output_Num);
    }
    return 0;
}

验证效果 输入4个数字(这里必须输入六个数字后截取前四个,暂时没想到很好的解决办法),取出3个,再输入5个,全部取出,观察是否没有覆盖旧数据。

 可以看到第一次输入的1 2 3 4 ,取出的是1 2 3,此时队列中还剩4 ,写入 9 8 7 6 5 后,由于不覆盖旧数据,因此队列中应该是4 9 8 7 6 5,最终验证代码正确。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值