c语言中队列应用的程序,队列的定义与实现(C语言实现)

小时候,我们做早操的时候或者军训的时候,都排成一列,有头有尾。假设你迟到了,只能站到最后面一个,退场的时候,都是由第一个先走的。这就是队列雏形。

队列的定义

队列是一种特殊的线性表

队列仅在线性表的两端进行操作

队头(Front):取出数据元素的一端

队尾(Rear):插入数据元素的一端

队列不允许在中间部位进行操作!

队列实质上也就是线性表的一种特殊操作形式,在头部删除,获取,在尾部添加。跟栈基本类似,换烫不换药。具体可以参考

与栈一样,队列同样具备线性和链式两种结构,分别如下:

======================================================================================================

队列的线性形式:

队列的线性形式本质上就是顺序线性表,这里同样采用代码复用的方式,关于顺序线性表的代码就不贴了,具体可以参阅

头文件:

#ifndef _SEQQUEUE_H_

#define _SEQQUEUE_H_

typedef void SeqQueue;

SeqQueue* SeqQueue_Create(int capacity);

void SeqQueue_Destroy(SeqQueue* queue);

void SeqQueue_Clear(SeqQueue* queue);

int SeqQueue_Append(SeqQueue* queue, void* item);

void* SeqQueue_Retrieve(SeqQueue* queue);

void* SeqQueue_Header(SeqQueue* queue);

int SeqQueue_Length(SeqQueue* queue);

int SeqQueue_Capacity(SeqQueue* queue);

#endif

源文件:

// 线性队列.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include "SeqList.h"

#include "SeqQueue.h"

#include

SeqQueue* SeqQueue_Create(int capacity)

{

return SeqList_Create(capacity);

}

void SeqQueue_Destroy(SeqQueue* queue)

{

SeqList_Destroy(queue);

}

void SeqQueue_Clear(SeqQueue* queue)

{

SeqList_Clear(queue);

}

//在尾部插入

int SeqQueue_Append(SeqQueue* queue, void* item)

{

return SeqList_Insert(queue, item, SeqList_Length(queue));

}

//删除头部

void* SeqQueue_Retrieve(SeqQueue* queue)

{

return SeqList_Delete(queue, 0);

}

//获得头部

void* SeqQueue_Header(SeqQueue* queue)

{

return SeqList_Get(queue, 0);

}

int SeqQueue_Length(SeqQueue* queue)

{

return SeqList_Length(queue);

}

int SeqQueue_Capacity(SeqQueue* queue)

{

return SeqList_Capacity(queue);

}

int _tmain(int argc, _TCHAR* argv[])

{

SeqQueue* queue = SeqQueue_Create(20);

int a[10] = {0};

int i = 0;

for(i=0; i<10; i++)

{

a[i] = i + 1;

SeqQueue_Append(queue, a + i);

}

printf("Header: %d\n", *(int*)SeqQueue_Header(queue));

printf("Length: %d\n", SeqQueue_Length(queue));

printf("Capacity: %d\n", SeqQueue_Capacity(queue));

while( SeqQueue_Length(queue) > 0 )

{

printf("Retrieve: %d\n", *(int*)SeqQueue_Retrieve(queue));

}

SeqQueue_Destroy(queue);

system("pause");

return 0;

}

运行结果:

Header: 1

Length: 10

Capacity: 20

Retrieve: 1

Retrieve: 2

Retrieve: 3

Retrieve: 4

Retrieve: 5

Retrieve: 6

Retrieve: 7

Retrieve: 8

Retrieve: 9

Retrieve: 10

请按任意键继续. . .

======================================================================================

队列的链式实现:

同样,队列的链式实现本质上就是链式线性表,关于链表的代码请参阅:链表的实现与操作(C语言实现)

头文件:

#ifndef _LINKQUEUE_H_

#define _LINKQUEUE_H_

typedef void LinkQueue;

LinkQueue* LinkQueue_Create();

void LinkQueue_Destroy(LinkQueue* queue);

void LinkQueue_Clear(LinkQueue* queue);

int LinkQueue_Append(LinkQueue* queue, void* item);

void* LinkQueue_Retrieve(LinkQueue* queue);

void* LinkQueue_Header(LinkQueue* queue);

int LinkQueue_Length(LinkQueue* queue);

#endif

源文件:

// 链式队列.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include "LinkList.h"

#include "LinkQueue.h"

#include

#include

int _tmain(int argc, _TCHAR* argv[])

{

LinkQueue* queue = LinkQueue_Create();

int a[10] = {0};

int i = 0;

for(i=0; i<10; i++)

{

a[i] = i + 1;

LinkQueue_Append(queue, a + i);

}

printf("Header: %d\n", *(int*)LinkQueue_Header(queue));

printf("Length: %d\n", LinkQueue_Length(queue));

while( LinkQueue_Length(queue) > 0 )

{

printf("Retrieve: %d\n", *(int*)LinkQueue_Retrieve(queue));

}

LinkQueue_Destroy(queue);

system("pause");

return 0;

}

typedef struct _tag_LinkQueueNode

{

LinkListNode header;

void* item;

} TLinkQueueNode;

LinkQueue* LinkQueue_Create()

{

return LinkList_Create();

}

void LinkQueue_Destroy(LinkQueue* queue)

{

LinkQueue_Clear(queue);

LinkList_Destroy(queue);

}

void LinkQueue_Clear(LinkQueue* queue) // O(n)

{

while( LinkQueue_Length(queue) > 0 )

{

LinkQueue_Retrieve(queue);

}

}

//在尾部添加

int LinkQueue_Append(LinkQueue* queue, void* item)

{

TLinkQueueNode* node = (TLinkQueueNode*)malloc(sizeof(TLinkQueueNode));

int ret = (item != NULL) && (node != NULL);

if( ret )

{

node->item = item;

ret = LinkList_Insert(queue, (LinkListNode*)node, LinkList_Length(queue));

}

if( !ret )

{

free(node);

}

return ret;

}

//删除头部

void* LinkQueue_Retrieve(LinkQueue* queue)

{

TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Delete(queue, 0);

void* ret = NULL;

if( node != NULL )

{

ret = node->item;

free(node);

}

return ret;

}

//获得头

void* LinkQueue_Header(LinkQueue* queue)

{

TLinkQueueNode* node = (TLinkQueueNode*)LinkList_Get(queue, 0);

void* ret = NULL;

if( node != NULL )

{

ret = node->item;

}

return ret;

}

int LinkQueue_Length(LinkQueue* queue)

{

return LinkList_Length(queue);

}

运行结果:

Header: 1

Length: 10

Retrieve: 1

Retrieve: 2

Retrieve: 3

Retrieve: 4

Retrieve: 5

Retrieve: 6

Retrieve: 7

Retrieve: 8

Retrieve: 9

Retrieve: 10

请按任意键继续. . .

如有错误,望不吝指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值