zoukankan      html  css  js  c++  java
  • 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]
    ", __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
    

      

  • 相关阅读:
    java构造方法和重写equals
    JVM,Java虚拟机基础知识新手入门教程(超级通熟易懂)
    ExtJS用Grid显示数据后如何自动选取第一条记录
    java 各种数据类型的互相转换
    提升思考力的8种日常训练法
    Java时间为什么从1970-01-01 00:00:00 000开始
    extjs计算两个DateField所间隔的月份(天数)
    如何快速理解他人代码,提高开发效率
    mybatis使用collection标签配置某个对象中的List集合类型的属性例子 <collection >
    将原有的Maven项目复制成另一个新名称的项目(包括:访问链接的时候也是使用的是新改的名称,而不是使用被复制项目的名称)
  • 原文地址:https://www.cnblogs.com/veis/p/12913073.html
Copyright © 2011-2022 走看看