程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言隊列的實現,C語言隊列實現

C語言隊列的實現,C語言隊列實現

編輯:關於C語言

C語言隊列的實現,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 }

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved