数组环形队列(FIFO)

2023-11-04

数组环形队列(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个,最终得到数据是一次排列的,说明队列没问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数组环形队列(FIFO) 的相关文章

随机推荐