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 By veis