使用C语言实现循环队列

正文:

.h


#ifndef __CIRCULAR_QUEUE_H__
#define __CIRCULAR_QUEUE_H__

#include "stdint.h"
#include "string.h"
#include "stdlib.h"


#define USEDYNAMICMEMALLOC  0      /*--使用动态内存--*/
#define STATICMEMSIZE       1000   /*--使用静态内存时,静态数组的大小--*/






typedef struct __CircularQueue
{
  
  uint16_t fullQueueLen;
  uint16_t queueLen;
  uint16_t head;
  uint16_t tail;
  int16_t (*deQueue)(struct __CircularQueue*);
  int16_t (*enQueue)(struct __CircularQueue*, uint8_t);
  void (*priorityEnQueue)(struct __CircularQueue*, uint8_t);
  #if USEDYNAMICMEMALLOC
  uint8_t* queue;
  #else
  uint8_t queue[STATICMEMSIZE];
  #endif

}CircularQueue_t;


/*-----函数声明-----*/
extern void CirQueueInit(CircularQueue_t* queue, uint16_t len);


#endif /*#ifndef __CIRCULAR_QUEUE_H__*/

.c

    /*
        说明:本文件为循环队列相关,对于循环队列 CircularQueue_t 定义的数据之前,必须
              先对该数据进行初始化,否则队列中的很多成员的值是不确定的。
              
              例如:定义一个循环队列: CircularQueue_t queue;
                    在对循环队列queue进行任何操作之前,必须先初始化: CirQueueInit(&queue, 0);
                    否则程序必然跑飞。
                    
              
            <!!重要>:在对循环队列进行任何操作之前,必须先初始化
            <!!重要>:在对循环队列进行任何操作之前,必须先初始化
            <!!重要>:在对循环队列进行任何操作之前,必须先初始化
        
        说明:循环队列中预留了5个位置用于优先入队
    */






#include "circular_queue.h"
#include <stdio.h>


static int16_t deQueue(CircularQueue_t* queue);
static int16_t enQueue(CircularQueue_t* queue, uint8_t element);
static void priorityEnQueue(CircularQueue_t* queue, uint8_t element);

/*-------------------------------------------------------------
  @>功能:初始化一个循环队列
  @>参数:len为使用动态内存时的指定参数,指定动态内存总大小
          若使用静态内存,len值任意,一般指定为0 
---------------------------------------------------------------*/
void CirQueueInit(CircularQueue_t* queue, uint16_t len)
{
  #if USEDYNAMICMEMALLOC
  queue->queue = (uint8_t*)malloc(len);
  queue->fullQueueLen = len;
  #else
  queue->fullQueueLen = STATICMEMSIZE;
  #endif
  queue->deQueue = deQueue;
  queue->enQueue = enQueue;
  queue->priorityEnQueue = priorityEnQueue;
  queue->queueLen = 0;
  queue->head = 0;
  queue->tail = 0;

  memset(queue->queue, 0, queue->fullQueueLen);
}


/*--出队,成功返回出队元素,失败返回-1--*/
static int16_t deQueue(CircularQueue_t* queue)
{
  uint8_t retval;
  if(!queue->queueLen) 
  {
    printf("出队失败,队列空\r\n");
    return -1;
  }
  else
  {
    retval = queue->queue[queue->head++];
    if(queue->head > queue->fullQueueLen - 1)
    {
      queue->head = 0;
      queue->queue[queue->fullQueueLen - 1] = 0;
    }
    else
    {
      queue->queue[queue->head - 1] = 0;
    }
    queue->queueLen--;
    return retval;
  }
}


/*--入队,成功返回0,失败返回-1--*/
static int16_t enQueue(CircularQueue_t* queue, uint8_t element)
{
  if(queue->fullQueueLen - queue->queueLen <= 5)    /*--程序会至少在队列中留5个位置用于优先入队---*/
  {
    printf("非优先入队失败,队列已满\r\n");
    return -1;
  }
  if(queue->tail > queue->fullQueueLen - 1)
  {
    queue->queue[0] = element;
    queue->tail = 1;
  }
  else
  {
    queue->queue[queue->tail++] = element;
  }
  queue->queueLen++;
  return 0;
}



/*--优先入队,插入队首---*/
static void priorityEnQueue(CircularQueue_t* queue, uint8_t element)
{
  if(queue->fullQueueLen - queue->queueLen > 0)
  {
    queue->head--;
    if(queue->head > queue->fullQueueLen)
    {
      queue->head = queue->fullQueueLen - 1;
    }
    queue->queueLen++;
    queue->queue[queue->head] = element;
    return;
  }
  printf("优先入队失败,队列已满\r\n");
}

创建和使用:

/*---NAND指令队列---*/
static CircularQueue_t NAND_InstQue;   
static CircularQueue_t NAND_ParaByte1Que;
static CircularQueue_t NAND_ParaByte2Que;
static CircularQueue_t NAND_ParaByte3Que;

/*---宏函数:入队一条指令及其参数---*/
#define MacroNandEnQue(w,x,y,z)   NAND_InstQue.enQueue(&NAND_InstQue, (w));             \
                                  NAND_ParaByte1Que.enQueue(&NAND_ParaByte1Que, (x));   \
                                  NAND_ParaByte2Que.enQueue(&NAND_ParaByte2Que, (y));   \
                                  NAND_ParaByte3Que.enQueue(&NAND_ParaByte3Que, (z))

/*---宏函数:出队一条指令及其参数---*/
#define MacroNandDeQue(w,x,y,z)   (w) = NAND_InstQue.deQueue(&NAND_InstQue);            \
                                  (x) = NAND_ParaByte1Que.deQueue(&NAND_ParaByte1Que);  \
                                  (y) = NAND_ParaByte2Que.deQueue(&NAND_ParaByte2Que);  \
                                  (z) = NAND_ParaByte3Que.deQueue(&NAND_ParaByte3Que)
                                
/*---宏函数:初始化NAND队列---------*/
#define MacroNandQueInit()        CirQueueInit(&NAND_InstQue, 0);                       \
                                  CirQueueInit(&NAND_ParaByte1Que, 0);                  \
                                  CirQueueInit(&NAND_ParaByte2Que, 0);                  \
                                  CirQueueInit(&NAND_ParaByte3Que, 0)
发布了4 篇原创文章 · 获赞 1 · 访问量 101

猜你喜欢

转载自blog.csdn.net/socbis/article/details/105555015