欢迎来到我的博客https://www.cnblogs.com/veis/

https://www.cnblogs.com/veis/p/14182037.html

C语言封装的环形队列

1、源代码

  

#include "queue.h"

/**
 * [CreateQueue 创建一个队列]
 * @param  nCount [队列的长度]
 * @return        [队列指针]
 */
p_queue CreateQueue(uint32_t nCount)
{
	p_queue p = malloc(sizeof(struct SQueue));
	p->m_pData = malloc(sizeof(DATA) * nCount); // 核心数据长度
	p->m_nCount = nCount; // 队列长度
	p->m_nSize = 0; // 队列中元素个数
	p->m_nHead = p->m_nTail = 0; // 队头和队尾
	return p;
}

/**
 * [RemoveAll 释放队列中申请的内存]
 * @param p [队列指针]
 */
void RemoveAll(p_queue p)
{
	if(!p)
		return;
	p->m_nCount = p->m_nSize = 0;
	p->m_nHead = p->m_nTail = 0;
	free(p->m_pData);
	free(p);
}

/**
 * [GetSize 获取队列中的元素个数]
 * @param  p [队列指针]
 * @return   [队列中元素的个数]
 */
int GetSize(p_queue p)
{
	ASSERT_ERROR(p);
	return p->m_nSize;
}

/**
 * [IsFull 判断队列是否满了]
 * @param  p [队列指针]
 * @return   [满则返回1.否则返回0]
 */
int IsFull(p_queue p)
{
	ASSERT_ERROR(p);
	return (p->m_nTail + 1) % p->m_nCount == p->m_nHead;
}

/**
 * [IsEmpty 判断队列是否为空]
 * @param  p [队列指针]
 * @return   [空则返回1,否则返回0]
 */
int IsEmpty(p_queue p)
{
	ASSERT_ERROR(p);
	return p->m_nHead == p->m_nTail;
}

/**
 * [Push 入队一个数据]
 * @param  p     [队列指针]
 * @param  pdata [需要入队的数据的地址]
 * @return       [成功入队返回TRUE,否则返回FALSE]
 */
int Push(p_queue p, const DATA *pdata)
{
	ASSERT_ERROR(p);
	if(IsFull(p))
		return FALSE;
	++(p->m_nSize);
	p->m_nTail = p->m_nTail % p->m_nCount;
	p->m_pData[(p->m_nTail)++] = *pdata;
	return TRUE;
}

/**
 * [PushData 入队一个数据]
 * @param  p [队列指针]
 * @param  d [需要入队的数据]
 * @return   [成功入队返回TRUE,否则返回FALSE]
 */
int PushData(p_queue p, const DATA d)
{
	ASSERT_ERROR(p);
	if(IsFull(p))
		return FALSE;
	++(p->m_nSize);
	p->m_nTail = p->m_nTail % p->m_nCount;
	p->m_pData[(p->m_nTail)++] = d;
	return TRUE;
}

/**
 * [Pop 弹出一个元素]
 * @param  p     [队列指针]
 * @param  pdata [接收弹出的数据,不需要此传出参数可以输入NULL]
 * @return       [成功弹出返回TRUE,否则返回FALSE]
 */
int Pop(p_queue p, DATA *pdata)
{
	ASSERT_ERROR(p);
	if (IsEmpty(p))
		return FALSE;
	--(p->m_nSize);
	p->m_nHead = p->m_nHead % p->m_nCount;
	if(pdata)
		*pdata = p->m_pData[p->m_nHead];
    ++(p->m_nHead);
	return TRUE;
}

  

2、头文件

  

#ifndef __QUEUE_H__
#define __QUEUE_H__

#include <stdlib.h>
#include <stdio.h>

#ifndef uint32_t
#define uint32_t unsigned int
#endif

#define DEBUG_ASSERT

#ifndef NULL
#define NULL (void *)0
#endif 

#ifndef FALSE
#define FALSE 0
#endif

#ifndef TRUE
#define TRUE 1
#endif

// 定义校验宏
#ifdef DEBUG_ASSERT
#define ASSERT_ERROR(x) do{if(!x){printf("[ERROR]:file[%s] line[%d] function[%s]\r\n", __FILE__, __LINE__, __func__);while(1);}}while(0)
#else
#define ASSERT_ERROR(x)
#endif

typedef int DATA;


// 环形队列数据结构
typedef struct SQueue
{
	DATA *m_pData;
	uint32_t m_nHead, m_nTail;
	uint32_t m_nCount, m_nSize;
} queue, *p_queue;

p_queue CreateQueue(uint32_t nCount);
void RemoveAll(p_queue p);
int GetSize(p_queue p);
int IsFull(p_queue p);
int IsEmpty(p_queue p);
int Push(p_queue p, const DATA *pdata);
int PushData(p_queue p, const DATA d);
int Pop(p_queue p, DATA *pdata);

#endif

  

posted @ 2020-05-18 21:26  veis  阅读(449)  评论(0编辑  收藏  举报