定义
只允许在一端进行插入数据,另一端删除数据的特殊线性表,队列具有先进先出的特性(FIFO),进行插入操作的一端称为队尾,进行删除操作的一端称为队头
链式队列
结构体定义
cpp
typedef int Qdata;
typedef struct Qnode
{
Qdata x;
struct Qnode* next;
}Qnode;
typedef struct MQueue
{
Qnode* head;
Qnode* tail;
int size;
}MQueue;
初始化和销毁
cpp
void Qinit(MQueue* qs)
{
assert(qs);
qs->head = qs->tail = NULL;
qs->size = 0;
}
void Qdel(MQueue* qs)
{
assert(qs);
Qnode* cur = qs->head;
while (cur)
{
Qnode* next = cur->next;
free(cur);
cur = next;
}
qs->head = qs->tail = NULL;
qs->size = 0;
}
入队列和出队列
cpp
void Qpush(MQueue* qs, Qdata x)
{
assert(qs);
Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));
if (newnode == NULL)
{
perror("newnode malloc fail");
return;
}
newnode->x = x;
newnode->next = NULL;
if (qs->head == NULL)
{
assert(qs->tail == NULL);
qs->head = qs->tail = newnode;
}
else
{
qs->tail->next = newnode;
qs->tail = newnode;
}
qs->size++;
}
void Qpop(MQueue* qs)
{
assert(qs);
assert(qs->size != 0);
Qnode* next = qs->head->next;
free(qs->head);
qs->head = next;
if (qs->head == NULL) qs->tail = NULL;
qs->size--;
}
功能实现
cpp
int Qsize(MQueue* qs)
{
assert(qs);
return qs->size;
}
bool Qempty(MQueue* qs)
{
assert(qs);
return qs->size == 0;
}
Qdata Qfront(MQueue* qs)
{
assert(qs);
assert(!Qempty(qs));
return qs->head->x;
}
Qdata Qback(MQueue* qs)
{
assert(qs);
assert(!Qempty(qs));
return qs->tail->x;
}