队列是一种特殊的线性表
队列仅在线性表的两端进行操作
队头(Front):取出数据元素的一端
队尾(Rear):插入数据元素的一端
队列不允许在中间部位进行操作!
queue常用操作
销毁队列
清空队列
进队列
出队列
获取队头元素
获取队列的长度
队列也是一种特殊的线性表;可以用线性表顺序存储来模拟队列。
主要代码:
// seqqueue.h
// 顺序存储队列API声明
#ifndef _MY_SEQQUEUE_H_
#define _MY_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 //_MY_SEQQUEUE_H_
// seqqueue.cpp
// 顺序存储队列API实现
// 调用了顺序存储表的API
#include <stdio.h>
#include "seqqueue.h"
#include "seqlist.h"
// 创建队列相当于创建一个链表
SeqQueue* SeqQueue_Create(int capacity)
{
return SeqList_Create(capacity);
}
// 销毁队列相当于销毁链表
void SeqQueue_Destroy(SeqQueue* queue)
{
SeqList_Destroy(queue);
return;
}
// 清空队列相当于清空链表
void SeqQueue_Clear(SeqQueue* queue)
{
SeqList_Clear(queue);
return;
}
// 入队列相当于在链表尾部插入元素
int SeqQueue_Append(SeqQueue* queue, void* item)
{
return SeqList_Insert(queue, item, SeqList_Length(queue));
}
// 出队列相当于删除链表0号位置的元素
void* SeqQueue_Retrieve(SeqQueue* queue)
{
return SeqList_Delete(queue, 0);
}
// 获取对头元素相当于获取链表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);
}
// main.cpp
// 顺序存储队列API的测试程序
#include <stdio.h>
#include "seqqueue.h"
const int maxn = 10;
void play()
{
int i = 0, a[maxn];
SeqQueue *sq = NULL;
for (i = 0; i < maxn; ++i) {
a[i] = i + 1;
}
sq = SeqQueue_Create(20); // 创建队列
// 入队列
for (i = 0; i < maxn; ++i) {
SeqQueue_Append(sq, &a[i]);
}
// 获取队列属性
printf("header: %d\n", *((int *)SeqQueue_Header(sq)));
printf("length: %d\n", SeqQueue_Length(sq));
printf("capacity: %d\n", SeqQueue_Capacity(sq));
// 出队列
while (SeqQueue_Length(sq)) {
int tmp = *((int *)SeqQueue_Retrieve(sq));
printf("%d\n", tmp);
}
SeqQueue_Destroy(sq);
}
int main()
{
play();
return 0;
}
有关顺序存储表的相关内容,请参看我的另一篇博文: 线性表的顺序存储设计和实现 - API函数实现
详细工程代码:Github