队列是之允许在一端进行插入操作 ,一段进行删除操作,插入的一段叫队尾,删除的一段叫头
队列是一种先进先出的线性表
如下图
定义一个队列
typedef int DataType;
typedef struct Qnode
{
DataType val;
struct Qnode* next;
}Qnode;
typedef struct Queue
{
Qnode* head;
Qnode* tail;
int size;//记录元素个数
}Queue;
初始化队列
void QueueInit(Queue* ps)
{
assert(ps);
ps->tail = NULL;
ps->head = NULL;
ps->size = 0;
}
入队列
void QueuePush(Queue* ps, DataType x)
{
assert(ps);
Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));
if (newnode == NULL)
{
perror("malloc fail");
exit(-1);
}
newnode->val = x;
newnode->next = NULL;
//判断是否是第一次进队列(尾插)
if (ps->tail == NULL)
{
ps->head = ps->tail = newnode;
}
else
{
ps->tail->next = newnode;
ps->tail = newnode;
}
ps->size++;
}
在入队列时的思路和单链表的尾插一样 需要注意一下第一次进队列要特殊处理
出队列
void QueuePop(Queue* ps)
{
assert(ps);
//检查队列是否为空
assert(!QueueEmpty(ps));
//只有一个元素 head和tail在同一节点
if (ps->head->next == NULL)
{
free(ps->head);
ps->tail = ps->head = NULL;
}
else
{
Qnode* next = ps->head->next;
free(ps->head);
ps->head = next;
}
ps->size--;
}
在出队列时 即单链表的头删 如果只有一个节点 需要特殊处理
销毁队列
void QueueDestory(Queue* ps)
{
assert(ps);
Qnode* cur = ps->head;
while (cur != NULL)
{
Qnode* next = cur->next;
free(cur);
cur = next;
}
ps->head = ps->tail = NULL;
ps->size = 0;
}
和单链表一样 保存下一个节点 依次释放
获取队列头元素
DataType QueueFront(Queue* ps)
{
assert(ps);
//检查队列是否为空
assert(!QueueEmpty(ps));
return ps->head->val;
}
获取队列尾元素
DataType QueueBack(Queue* ps)
{
assert(ps);
//检查队列是否为空
assert(!QueueEmpty(ps));
return ps->tail->val;
}
检测队列是否为空
bool QueueEmpty(Queue* ps)
{
assert(ps);
return ps->head == NULL;
}
获取队列元素个数
int QueueSzie(Queue* ps)
{
assert(ps);
return ps->size;
}
以上就是关于队列的基本接口实现了 希望大佬指正