13-定义一个接口
17.4.2 定义一个接口
接口定义放在 queue.h 文件中。我们使用 C 的 typedef 工具创建两个类型名: Item 和 Queue 。相应结构的具体实现应该是 queue.h 文件的一部分,但是从概念上来看,应该在实现阶段才设计结构。现在,只是假定已经定义了这些类型,着重考虑函数的原型。
首先,考虑初始化。这涉及改变 Queue 类型,所以该函数应该以 Queue 的地址作为参数:
void InitializeQueue(Queue * pq);
接下来,确定队列是否为空或已满的函数应返回真或假值。这里,假设 C99 的 stdbool.h 头文件可用。如果该文件不可用,可以使用 int 类型或自己定义 bool 类型。由于该函数不更改队列,所以接受 Queue 类型的参数。但是,传递 Queue 的地址更快,更节省内存,这取决于 Queue 类型的对象大小。这次我们尝试这种方法。这样做的好处是,所有的函数都以地址作为参数,而不像 List 示例那样。为了表明这些函数不更改队列,可以且应该使用 const 限定符:
bool QueueIsFull(const Queue * pq);
bool QueueIsEmpty(const Queue * pq);
指针 pq 指向 Queue 数据对象,不能通过 pq 这个代理更改数据。可以定义一个类似该函数的原型,返回队列的项数:
int QueueItemCount(const Queue * pq);
在队列末尾添加项涉及标识项和队列。这次要更改队列,所以有必要(而不是可选)使用指针。该函数的返回类型可以是 void ,或者通过返回值来表示是否成功添加项。我们采用后者:
bool EnQueue(Item item, Queue * pq);
最后,删除项有多种方法。如果把项定义为结构或一种基本类型,可以通过函数返回待删除的项。函数的参数可以是 Queue 类型或指向 Queue 的指针。因此,可能是下面这样的原型:
Item DeQueue(Queue q);
然而,下面的原型会更合适一些:
bool DeQueue(Item * pitem, Queue * pq);
从队列中待删除的项存储在 pitem 指针指向的位置,函数的返回值表明是否删除成功。
清空队列的函数所需的唯一参数是队列的地址,可以使用下面的函数原型:
void EmptyTheQueue(Queue * pq);