环形队列原理及基于C++的实现

环形队列在嵌入式软件中扮演关键角色,用于解决CPU与低速通讯外设间的同步问题。其通过数组实现,使用两个指针表示队头和队尾,利用求余运算实现首位连接的循环效果。当指针相遇,分别表示队列满或空。
摘要由CSDN通过智能技术生成

环形队列原理及基于C++的实现


一、环形队列的作用

在嵌入式软件中,环形队列的地位是非常重要的。由于经常需要用到串口、SPI等通讯接口,为了避免高速CPU等待低速通讯外设的情况出现,通常需要给通讯接口的数据发送和接收分配缓存,而这一缓存需要实现先入先出这一功能,而环形队列正好拥有这一功能。

二、环形队列的原理

环形队列任然是基于数组实现的,但是为了更加形象化的描述,我们用如下图表示:
在这里插入图片描述

  1. 图中有两个指针(其实就是两个变量,因为在这里有指示作用,所以这里理解为指针_writeIndex、_readIndex,一个指示队头,一个指示队尾。
  2. _writeIndex和_readIndex互相追赶着,这个追赶过程就是队列添加和删除的过程,如果_writeIndex追到_readIndex说明队列满了(通常会留一个位置),如果_readIndex追到_writeIndex说明队列为空。
  3. 我们把它掰弯,用的是求余,这样这两个值就不会跑出最大范围,并且可以实现首位连接的效果,所以说对于循环队列我们必须给定最大值MAXQSIZE。

三、环形队列的软件实现

#pragma once
#include <string.h>

template<typename T>
class RingQueue
{
public:
    // 设置存储空间,及其大小。
    void setBuff(T *buff, unsigned int len);

    // 从尾部加入一个数据。
    void push(T d);

    // 从头部弹出一个数据。
    T pop(void);

    // 从头部弹出若干数据。
    unsigned int copyOut(T *buf, unsigned int len);

	// 从尾部加入若干数据。
	unsigned int copyIn(T *buf, unsigned int len);

    // 头部数据。
    T head(bool &isok);

    // 头部数据。
    T head();

    // 尾部数据。
    T tail(bool &isok);

    // 当前数据个数。
    unsigned int size(void);

    // 获取指定位置的数据。
    T &at(int index);

    // 空/满判断。
    inline bool isEmpty(void);
    inline bool isFull(void);

    // 清空。
    void clear(void);

    // 构造与析构。
    RingQueue();
    virtual ~RingQueue();

private:
    T *_buff;
    unsigned int _len;
    unsigned int _writeIndex;
    unsigned int _readIndex;
};

/*************************************************************************
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值