数组环形队列(FIFO)
一、说明
环形队列的关键是判断队列为空,还是为满。当tail追上head时,队列为满,当head追上tail时,队列为空。
二、代码实现
#define ElemType uint8_t //定义数据类型
#define QueueSize 10 //队列大小
typedef enum {
QueueEmpty = 0, //队列空
QueueFull, //队列满
QueueOK, //操作成功
}QueueState;
typedef struct {
ElemType head; //队列头
ElemType tail; //队列尾
ElemType array[QueueSize]; //队列数据
uint16_t count; //队列计数
}FifoQueue;
/**
* @Function: QueueInit
* @Description: 初始化FIFO队列
* @Input: Queue: FifoQueue结构体成员变量
* @Return: None
* @Others: None
*/
void QueueInit(FifoQueue* Queue)
{
Queue->head = Queue->tail; //初始化时队列头队列首相连
Queue->count = 0; //队列计数清零
}
/**
* @Function: QueueInput
* @Description: FIFO 数据入队列
* @Input: Queue: FifoQueue结构体成员变量
* data: 入队列的数据
* @Return: 状态值 QueueFull: 队列满
* QueueOK: 入队成功
* @Others: None
*/
QueueState QueueInput(FifoQueue* Queue, ElemType data)
{
if (Queue->head == Queue->tail && Queue->count == QueueSize)
{
return QueueFull;
}
else
{
Queue->array[Queue->tail] = data;
Queue->tail = (Queue->tail + 1) % QueueSize;
Queue->count++;
return QueueOK;
}
}
/**
* @Function: QueueOutput
* @Description: FIFO 数据出队列
* @Input: Queue: FifoQueue结构体成员变量
* data: 数据出队列
* @Return: 状态值 QueueEmpty: 队列空
* QueueOK: 出队成功
* @Others: None
*/
QueueState QueueOutput(FifoQueue* Queue, ElemType* data)
{
if (Queue->head == Queue->tail && Queue->count == 0)
{
return QueueEmpty;
}
else
{
*data = Queue->array[Queue->head];
Queue->head = (Queue->head + 1) % QueueSize;
Queue->count--;
return QueueOK;
}
}
三、代码测试
1、测试代码
FifoQueue QueueTest;
int main()
{
uint8_t i;
uint8_t buffer[12] = { 0 };
QueueState Res;
QueueInit(&QueueTest);
//验证入队满功能
for (i = 0; i < 12; i++)
{
Res = QueueInput(&QueueTest, i);
if (Res == QueueFull)
{
printf("队列满 \r\n");
}
}
//验证出队空功能
for (i = 0; i < 12; i++)
{
Res = QueueOutput(&QueueTest, &buffer[i]);
if (Res == QueueEmpty)
{
printf("队列空 \r\n");
}
printf("buffer = %d \r\n", buffer[i]);
}
//验证入队出队功能
for (i = 0; i < 5; i++) //入5个
{
Res = QueueInput(&QueueTest, i);
if (Res == QueueFull)
{
printf("队列满 \r\n");
}
}
for (i = 0; i < 2; i++) //出2个
{
Res = QueueOutput(&QueueTest, &buffer[i]);
if (Res == QueueEmpty)
{
printf("队列空 \r\n");
}
}
for (i = 5; i < 10; i++) //入5个
{
Res = QueueInput(&QueueTest, i);
if (Res == QueueFull)
{
printf("队列满 \r\n");
}
}
for (i = 2; i < 10; i++) //出8个
{
Res = QueueOutput(&QueueTest, &buffer[i]);
if (Res == QueueEmpty)
{
printf("队列空 \r\n");
}
}
for (i = 0; i < 12; i++) //最终打印
{
printf("EndBuffer = %d \r\n", buffer[i]);
}
}
2、输出结果
如图,队列大小为10个字节,打印12次,后面两次报了队列满,同理,出队列也是打印12次,最终有两次队列空;最后一次验证入队5个,出队2个,再入队5个,出队8个,最终得到数据是一次排列的,说明队列没问题。