设为首页 加入收藏

TOP

一步一步写算法(之线性队列)(一)
2014-11-23 23:33:49 来源: 作者: 【 】 浏览:2
Tags:步一步 算法 线性 队列

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

这里的线性结构实际上指的就是连续内存的意思,只不过使用“线性”这个词显得比较专业而已。前面一篇博客介绍了现象结构的处理方法,那么在这个基础之上我们是不是添加一些属性形成一种新的数据结构类型呢?答案是肯定的,队列便是其中的一种。

队列的性质很简单:

(1)队列有头部和尾部

(2)队列从尾部压入数据

(3)队列从头部弹出数据

那么连续内存下的队列是怎么实现的呢?

a)设计队列数据结构

typedef struct _QUEUE_NODE

{

int* pData;

int length;

int head ;

int tail;

int count;

}QUEUE_NODE;

typedef struct _QUEUE_NODE

{

int* pData;

int length;

int head ;

int tail;

int count;

}QUEUE_NODE; b)申请队列内存

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);

return NULL;

}

pQueueNode->length = number;

return pQueueNode;

}

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);

return NULL;

}

pQueueNode->length = number;

return pQueueNode;

} c)释放队列内存

STATUS delete_queue(const QUEUE_NODE* pQueueNode)

{

if(NULL == pQueueNode)

return FALSE;

assert(NULL != pQueueNode->pData);

free(pQueueNode->pData);

free((void*)pQueueNode);

return TRUE;

}

STATUS delete_queue(const QUEUE_NODE* pQueueNode)

{

if(NULL == pQueueNode)

return FALSE;

assert(NULL != pQueueNode->pData);

free(pQueueNode->pData);

free((void*)pQueueNode);

return TRUE;

} d)把数据压入队列

STATUS insert_queue(QUEUE_NODE* pQueueNode, int value)

{

if(NULL == pQueueNode)

return FALSE;

if(pQueueNode->length == pQueueNode->count)

return FALSE;

pQueueNode->tail = (pQueueNode->tail + 1) % pQueueNode->length;

pQueueNode->pData[pQueueNode->tail] = value;

pQueueNode->count ++;

return TRUE;

}

STATUS insert_queue(QUEUE_NODE* pQueueNode, int value)

{

if(NULL == pQueueNode)

return FALSE;

if(pQueueNode->length == pQueueNode->count)

return FALSE;

pQueueNode->tail = (pQueueNode->tail + 1) % pQueueNode->length;

pQueueNode->pData[pQueueNode->tail] = value;

pQueueNode->count ++;

return TRUE;

} e)把数据弹出队列

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;

pQueueNode-> count --;

pQueueNode->head = (pQueueNode->head + 1) % pQueueNode->length;

return TRUE;

}

STATUS

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇一步一步写算法(之双向链表) 下一篇一步一步写算法(之线性堆栈)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: