队列的一个显著特征是它按照先进先出(FIFO)的方式存储和检索元素。这意味着先存入队列的元素将首先被删除 。我们可以形象的把队列看作是在车站排队买票的一队人。当新人一个一个排到队尾时,队伍也在不停变化。当队伍最前面一个人买完票后将首先离开,接着是下一个,再下一个...在计算机中,将一个元素加入队尾,称为“入队”操作;将一个元素从队首删除,称为“出队”操作(见图1)。我们可以通过检查队列头元素(而不是删除它)来获取元素的某些信息。
队列的接口定义
queue_init |
void queue_init(Queue *queue,void(*destroy)(void *data)); |
返回值:无 |
描述:初始化由queue指定的队列。 在队列进行其他操作之前必须调用初始化函数。参数destroy是一个函数指针,通过调用queue_destroy来释放动态分配的内存空间。它的工作原理与stack_destroy相似。如果队列中的数据不需要释放,那么destroy应该指向NULL。 |
复杂度:O(1) |
queue_destroy |
void queue_destroy(Queue *queue); |
返回值:无 |
描述:销毁由queue指定的队列。 在调用queue_destroy之后,队列不允许进行其他操作。除非再次调用queue_init。queue_destroy会删除队列中的所有元素,同时释放queue_init中参数destroy不为NULL时的成员所占有的内存空间。 |
复杂度:O(n),n为队列中元素的个数。 |
queue_enqueue |
int queue_enqueue(Queue *queue,const void *data); |
返回值:如果元素入队成功则返回零,否则返回-1。 |
描述:向queue指定的队列末尾中插入一个元素。新元素包含一个指向data的指针,因此只要元素仍然存在于队列中,data引用的内存就一直有效。与data相关的存储空间由函数的调用者来管理。 |
复杂度:O(1) |
queue_dequeue |
int queue_dequeue(Queue *queue,const void **data); |
返回值:如果元素出队成功则返回0,否则返回-1。 |
描述:从queue指定的队列头部删除一个元素。返回时data指向已删除元素中存储的数据。与data相关的存储空间将由函数调用者来管理。 |
复杂度:O(1) |
queue_peek |
void* queue_peek(const Queue *queue); |
返回值:队列头部元素中存储的数据;如果队列为空则返回NULL。 |
描述:获取由queue指定的队列头部元素中存储数据的宏。 |
复杂度:O(1) |
queue_size |
int queue_size(const Queue *queue); |
返回值:队列中元素的个数。 |
描述:获取由queue指定的队列元素个数的宏。 |
复杂度:O(1) |