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