【摘要】队列特性:先进先出(FIFO)——先进队列的元素先出队列。来源于我们生活中的队列(先排队的先办完事)。
这样有个缺陷,空间利用率不高,所以我们直接学习循环队列(基于连续内存的)。
(1)设计队列数据结构
typedef struct _QUEUE_NODE
{
int* pData;
int length;//队列长度
int head ;//队头指针
int tail;//队尾指针
int count;//队列元素当前个数
}QUEUE_NODE;
(2)申请队列内存
QUEUE_NODE* alloca_queue(int number)
{
QUEUE_NODE* pQueueNode;
if( 0 == number)
return NULL;
pQueueNode = (QUEUE_NODE*)malloc(sizeof(QUEUE_NODE));
assert(NULL != pQueueNode);
memset(pQueueNode, 0, sizeof(QUEUE_NODE));
pQueueNode->pData = (int*)malloc(sizeof(int) * number);
if(NULL == pQueueNode->pData){
free(pQueueNode);
pQueueNode = NULL;
return NULL;
}
pQueueNode->length = number;//队列长度
return pQueueNode;
}
(3)释放队列内存
STATUS delete_queue(const QUEUE_NODE* pQueueNode)
{
if(NULL == pQueueNode)
return FALSE;
assert(NULL != pQueueNode->pData);
free(pQueueNode->pData);
free((void*)pQueueNode);
return TRUE;
}
(4) 把数据压入队列
STATUS insert_queue(QUEUE_NODE* pQueueNode, int value)
{
if(NULL == pQueueNode)
return FALSE;
if(pQueueNode->length == pQueueNode->count)//判断是不是溢出
return FALSE;
pQueueNode->pData[pQueueNode->tail] = value;
pQueueNode->tail = (pQueueNode->tail + 1) % pQueueNode->length; //队尾指针位置
pQueueNode->count ++;
return TRUE;
}
(5)把数据弹出队列
STATUS get_queue_data(QUEUE_NODE* pQueueNode, int* value)
{
if(NULL == pQueueNode || NULL == value)
return FALSE;
if(0 == pQueueNode->count)
return FALSE;
*value = pQueueNode->pData[pQueueNode->head];
pQueueNode-> pData[pQueueNode->head] = 0; //被弹出的位置赋值为0
pQueueNode-> count --;
pQueueNode->head = (pQueueNode->head + 1) % pQueueNode->length;//重新定位队头指针的位置
return TRUE;
}
(6)统计当前队列中有多少数据
int get_total_number(const QUEUE_NODE* pQueueNode)
{
if(NULL == pQueueNode)
return 0;
return pQueueNode->count;
}
(7)查看队列中初始化的时候总长度是多少
int get_total_number(const QUEUE_NODE* pQueueNode)
{
if(NULL == pQueueNode)
return 0;
return pQueueNode->length;
}
时间: 2024-10-13 23:42:56