线性队列和线性堆栈有点相似,但队列里面的数据是“先进先出”。实际应用时大多是采用循环队列,关于队列的循环实现,需要两件事情要警惕:1、检测队列是否为空;2、检测队列是否已满。下面就简单的介绍循环队列的一些基本操作
1、队列的数据节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
   | typedef struct _Queue { 	int *pData;        	int capacity;      	int front;         	int rear;          	int count;         }Queue; 2、创建指定容量队列 Queue* createQueue(int num) { 	Queue *pQueue = NULL; 	if (0 == num) 		return NULL;
  4、入队列 线性循环队列等效认为数据域是一个环的数组空间,这样在入队列的时候,队列尾位置(实际上队列并没有严格的首尾之分)为(rear + 1) mod capacity。而不是简单的进行加1处理
  	pQueue = (Queue *)malloc(sizeof(Queue));   	assert(NULL != pQueue); 	memset(pQueue, 0, sizeof(Queue)); 	  	pQueue->pData = (int *)malloc(sizeof(int)* num);    	if (NULL == pQueue->pData) 	{ 		free(pQueue);           		pQueue = NULL; 		return NULL; 	} 	pQueue->capacity = num;     	  	return pQueue;
  }
   | 
 
3、判断队列空,满
1 2 3 4 5 6 7 8 9
   | bool isFull(Queue *pQueue) { 	return (pQueue->count == pQueue->capacity); }
  bool isEmpty(Queue *pQueue) { 	return (0 == pQueue->count); }
   | 
 
4、入队列
线性循环队列等效认为数据域是一个环的数组空间,这样在入队列的时候,队列尾位置(实际上队列并没有严格的首尾之分)为(rear + 1) mod capacity。而不是简单的进行加1处理
4、入队列
线性循环队列等效认为数据域是一个环的数组空间,这样在入队列的时候,队列尾位置(实际上队列并没有严格的首尾之分)为(rear + 1) mod capacity。而不是简单的进行加1处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   | bool enQueue(Queue *pQueue, int value) { 	if (NULL == pQueue) 		return false;
  	if (isFull(pQueue)) 		return false; 	  	pQueue->pData[pQueue->rear] = value; 	pQueue->rear = (pQueue->rear + 1) % pQueue->capacity; 	pQueue->count++; 	  	return true;
  }
   | 
 
5、出队列
5、出队列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   | bool deQueue(Queue *pQueue, int *value) { 	if (NULL == pQueue) 		return false;
  	if (isEmpty(pQueue)) 		return false; 	  	*value = pQueue->pData[pQueue->front]; 	pQueue->count--; 	pQueue->front = (pQueue->front + 1) % pQueue->capacity; 	  	return true;
  }
   | 
 
了解队列的特点,出队列的时候,是弹出队列前端数据
6、释放队列
了解队列的特点,出队列的时候,是弹出队列前端数据
6、释放队列
采用二级指针传递是在释放内存后,将队列指针设置为NULL,便于之后的基本操作的参数判断。使用一级指针也可释放内存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
   | bool freeQueue(Queue **ppQueue) { 	if ((NULL == ppQueue) || (NULL == *ppQueue)) 		return false;
  	if (NULL == (*ppQueue)->pData) 	{ 		free(*ppQueue); 		*ppQueue = NULL; 		return true; 	} 	  	free((*ppQueue)->pData); 	(*ppQueue)->pData = NULL; 	free(*ppQueue); 	*ppQueue = NULL; 	  	return true;
  }
   | 
 
7、打印队列数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | void printQueue(Queue *pQueue) { 	if (pQueue) 	{ 		int i = pQueue->front; 		int cnt = pQueue->count; 		while (0 != cnt) 		{ 			printf("%d\n", pQueue->pData[(i++) % pQueue->capacity]); 			--cnt; 		}
  		return; 	}
  } 设计循
   | 
 
环队列数据结构比较简单,需要注意的就是数据域循环的“环”的处理。