队列定义
队列:是一种特殊的线性表只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
队列的基本操作
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
队列也可以顺序表(数组)和链表的结构实现,由于队列支持尾插和头删,所以链表更适合实现队列
队列的实现
C语言带头尾指针的单链表实现队列:
队列的定义
typedef int Data;
typedef struct queuenode{
Data data;
struct queue* _next;
}queuenode;
typedef struct queue{
queuenode* _start;
queuenode* _end;
}queue;
队列的初始化
void init(queue* qe){
qe->_end = qe->_start = NULL;
}
队列增容
queuenode* createqe(Data data){
queuenode* node = (queuenode*)malloc(sizeof(queuenode));
node->data = data;
node->_next = NULL;
}
入队和出队
//入队(尾插)
void push(queue* qe, Data data){
queuenode* newqueue=createqe(data);
if (qe->_end == qe->_start == NULL){
qe->_end = qe->_start = newqueue;
}
else{
qe->_end->_next = newqueue;
qe->_end = newqueue;
}
}
//出队(头删)
void pop(queue* qe){
if (qe->_end == NULL){
return;
}
queuenode* next = qe->_start->_next;
free(qe->_start);
qe->_start = next;
//删除之后是否为空表
if (qe->_end == NULL){
qe->_end = NULL;
//避免end变为野指针
}
}
获取队头或队尾
//获取队头元素
int top(queue* qe){
return qe->_start->data;
}
int last(queue* qe){
return qe->_end->data;
}
获取元素数量
/获取数量
int size(queue* qe){
if (qe->_end == NULL){
return 0;
}
int i = 0;
queuenode* cur = qe->_start;
while (cur){
i++;
cur = cur->_next;
}
return i;
}
销毁队列
void destory(queue* qe)
{
assert(qe);
queuenode* cur = qe->_start;
while (cur)
{
queuenode* next = cur->_next;
free(cur);
cur = next;
}
qe->_start = qe->_end = NULL;
}