在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 }