C语言队列的实现
在C++ 里,队列可以直接使用 std::queue
队列的C语言实现如下:
1 queue.c 2 3 /** 4 * @brief 队列,顺序存储,循环队列. 5 */ 6 #include <stdlib.h> /* for malloc(), free() */ 7 #include <string.h> /* for memcpy() */ 8 9 #ifndef __cplusplus 10 typedef char bool; 11 #define false 0 12 #define true 1 13 #endif 14 15 typedef int queue_elem_t; // 元素的类型 16 17 /* 18 *@struct 19 *@brief 队列的结构体定义. 20 *@note 无 21 */ 22 typedef struct queue_t { 23 int front;/* 队头 */ 24 int rear;/* 队尾 */ 25 int capacity; /* 容量大小,以元素为单位 */ 26 queue_elem_t *elems; /* 存放数据的内存块 */ 27 }queue_t; 28 29 /** 30 * @brief 初始化队列. 31 * @param[out] q 队列结构体的指针 32 * @param[in] capacity 初始容量 33 * @return 无 34 */ 35 void queue_init(queue_t *q, const int capacity) { 36 q->front = 0; 37 q->rear = 0; 38 q->capacity = capacity; 39 q->elems = (queue_elem_t*)malloc(capacity * sizeof(queue_elem_t)); 40 } 41 42 /** 43 * @brief 释放队列. 44 * @param[inout] q 队列对象的指针 45 * @return 无 46 */ 47 void queue_uninit(queue_t *q) { 48 q->front = 0; 49 q->rear = 0; 50 q->capacity = 0; 51 free(q->elems); 52 q->elems = NULL; 53 } 54 55 /** 56 * @brief 判断队列是否为空. 57 * @param[in] q 队列结构体的指针 58 * @return 是空,返回 TRUE,否则返回 FALSE 59 */ 60 bool queue_empty(const queue_t *q) { 61 return q->front == q->rear; 62 } 63 64 /** 65 * @brief 获取元素个数. 66 * @param[in] s 栈对象的指针 67 * @return 元素个数 68 */ 69 int queue_size(const queue_t *q) { 70 return (q->rear - q->front + q->capacity) % q->capacity; 71 } 72 73 /** 74 * @brief 在队尾添加元素. 75 * @param[in] q 指向队列结构体的指针 76 * @param[in] x 要添加的元素 77 * @return 无 78 */ 79 void queue_push(queue_t *q, const queue_elem_t x) { 80 if( (q->rear+1) % q->capacity == q->front) 81 { 82 // 已满,重新分配内存 83 queue_elem_t* tmp = (queue_elem_t*)malloc(q->capacity * 2 * sizeof(queue_elem_t)); 84 if(q->front < q->rear) 85 { 86 memcpy(tmp, q->elems + q->front, (q->rear - q->front) * sizeof(queue_elem_t)); 87 q->rear -= q->front; 88 q->front = 0; 89 } 90 else if(q->front > q->rear) 91 { 92 /* 拷贝 q->front 到 q->capacity 之间的数据 */ 93 memcpy(tmp, q->elems + q->front, (q->capacity - q->front) * sizeof(queue_elem_t)); 94 /* 拷贝 q->data[0] 到 q->data[rear] 之间的数据 */ 95 memcpy(tmp + (q->capacity - q->front), q->elems, q->rear * sizeof(queue_elem_t)); 96 q->rear += q->capacity - q->front; 97 q->front = 0; 98 } 99 free(q->elems); 100 q->elems = tmp; 101 q->capacity *= 2; 102 } 103 q->elems[q->rear] = x; 104 q->rear = (q->rear + 1) % q->capacity; 105 } 106 107 108 /** 109 * @brief 在队头删除元素. 110 * @param[in] q 队列结构体的指针 111 * @param[out] x 存放退出队列的元素 112 * @return 无 113 */ 114 void queue_pop(queue_t *q) { 115 q->front = (q->front + 1) % q->capacity; 116 } 117 118 /** 119 * @brief 获取队首元素. 120 * @param[in] q 队列对象的指针 121 * @return 队首元素 122 */ 123 queue_elem_t queue_front(const queue_t *q) { 124 return q->elems[q->front]; 125 } 126 127 /** 128 * @brief 获取队首元素. 129 * @param[in] q 队列对象的指针 130 * @return 队首元素 131 */ 132 queue_elem_t queue_back(const queue_t *q) { 133 return q->elems[q->rear - 1]; 134 }