队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
简介
队列(queue)是具有特殊属性的列表。第一,新的项目只能被添加到列表结尾处;第二,项目只能从列表开始处被移除。可以将队列看成一群人排队买票,您在队尾加入,买完票从队首离开。队列是一种“先进先出(First in, First out)”的数据形式。
类型名称 | 队列 |
---|---|
类型属性: | 可保存一个项目序列 |
类型操作: | 把队列初始化为空列队列 |
确定队列是否为空 | |
确定队列是否已满 | |
确定队列中项目的个数 | |
向列表末尾添加项目 | |
遍历队列中的每个项目 | |
从队列首端删除和恢复项目 | |
清空队列 |
定义接口
1 | /* queue.h -- 队列接口 */ |
实现接口
添加项目
向队列中添加项目步骤:
- 创建新的节点
- 把项目复制到新节点
- 设置节点的next指针为NULL,表明该节点是列表中最后一个节点
- 设置当前尾节点的next指针指向新节点,从而将新节点链接到队列中。
- 把rear指针设置为指向新节点,以便找到最后的节点。
- 项目个数加一。
CopyToItem作为静态函数把项目复制到一个节点中
1 | static void CopyToNode(Item item, Node * pn) |
此外函数还需考虑两种情况。首先,队列为空,那么front就指向新节点。此时,新节点既是队首也是队尾。其次,如果新节点分配空间失败,需要执行一些操作。因此,代码如下:
1 | /* 队列添加项目 */ |
删除项目
从队列首端删除项目包括下列步骤:
- 把项目复制到一个给定变量中。
- 释放空闲节点使用的内存
- 重置首指针,使其指向队列中的下一项。
- 如果最后一项被删除,把首位均重置为NULL.
- 项目数减一。
CopyToItem()把一个节点项目复制到一个Item变量
1 | static void CopyToItem(Node * pn, Item * pi) |
1 | /* 队列删除项目 */ |
这里需要注意的是,虽然没有front指针没有置为null,但其实在删除最后一项时,已经把front指针设置为被删除节点的next指针,因为最后一项节点的next为空,所以front也会置为空。
完整代码
1 | /* 队列类型的实现 */ |
使用接口
1 | /* use_q.c -- 测试Queue的接口驱动程序 */ |
程序运行:
1 | Testing the Queue interface. Type a to add a value, |