作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。
个人主页:蜗牛牛啊
系列专栏:初出茅庐C语言、数据结构
学习格言:博观而约取,厚积而薄发
欢迎进来的小伙伴,如果小伙伴们在学习的过程中,发现有需要纠正的地方,烦请指正,希望能够与诸君一同成长!
队列只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 。
入队列:进行插入操作的一端称为队尾 。
出队列:进行删除操作的一端称为队头。
void QueueInit(Queue* pq)//初始化
{
assert(pq);
pq->head = pq->tail = NULL;
pq->size = 0;
}
bool QueueEmpty(Queue* pq)//判断是否为空
{
assert(pq);
return pq->head == NULL && pq->tail == NULL;
}
void QueuePush(Queue* pq, QDataType x)//入队
{
assert(pq);
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL)
{
perror("malloc");
exit(-1);
}
newnode->val = x;
newnode->next = NULL;
if (pq->head == NULL)
{
pq->head = pq->tail = newnode;
}
else
{
pq->tail->next = newnode;
pq->tail = newnode;
}
pq->size++;
}
入队时判断当队列为空时
pq->head=pq->tail=NULL
,不能对pq->tail
解引用。
void QueuePop(Queue* pq)//出队列
{
assert(pq);
assert(!QueueEmpty(pq));
if (pq->head->next == NULL)
{
free(pq->head);
pq->head = pq->tail = NULL;
}
else
{
QNode* cur = pq->head;
pq->head = cur->next;
free(cur);
}
pq->size--;
}
出队时要判断队列是否为空,
assert(!QueueEmpty(pq))
。
void QueuePrint(Queue* pq)//打印
{
assert(pq);
QNode* cur = pq->head;
while (cur)
{
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
}
注意循环条件
while (cur)
,不能写为while(cur!=pq->tail)
。
QDataType QueueFront(Queue* pq)//返回队头的值
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->head->val;
}
QDataType QueueBack(Queue* pq)//返回队尾的值
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->tail->val;
}
int QueueSize(Queue* pq)//返回队列中有效值个数
{
assert(pq);
//int size = 0;
//QNode* cur = pq->head;
//while (cur)
//{
// size++;
// cur = cur->next;
//}
//return size;
return pq->size;
}
void QueueDestroy(Queue* pq)//销毁
{
assert(pq);
QNode* cur = pq->head;
while (cur)
{
QNode* del = cur->next;
free(cur);
cur = del;
}
pq->head = pq->tail = NULL;
}
#include
#include
#include
#include
typedef int QDataType;
typedef struct QueueNode
{
QDataType val;
struct QueueNode* next;
}QNode;
typedef struct Queue {
QNode* head;
QNode* tail;
int size;
}Queue;
void QueueInit(Queue* pq)//初始化
{
assert(pq);
pq->head = pq->tail = NULL;
pq->size = 0;
}
void QueueDestroy(Queue* pq)//销毁
{
assert(pq);
QNode* cur = pq->head;
while (cur)
{
QNode* del = cur->next;
free(cur);
cur = del;
}
pq->head = pq->tail = NULL;
}
void QueuePrint(Queue* pq)//打印
{
assert(pq);
QNode* cur = pq->head;
while (cur)
{
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
}
bool QueueEmpty(Queue* pq)//判断是否为空
{
assert(pq);
return pq->head == NULL && pq->tail == NULL;
}
void QueuePush(Queue* pq, QDataType x)//入队
{
assert(pq);
QNode* newnode = (QNode*)malloc(sizeof(QNode));
if (newnode == NULL)
{
perror("malloc");
exit(-1);
}
newnode->val = x;
newnode->next = NULL;
if (pq->head == NULL)
{
pq->head = pq->tail = newnode;
}
else
{
pq->tail->next = newnode;
pq->tail = newnode;
}
pq->size++;
}
void QueuePop(Queue* pq)//出队列
{
assert(pq);
assert(!QueueEmpty(pq));
if (pq->head->next == NULL)
{
free(pq->head);
pq->head = pq->tail = NULL;
}
else
{
QNode* cur = pq->head;
pq->head = cur->next;
free(cur);
}
pq->size--;
}
QDataType QueueFront(Queue* pq)//返回队头的值
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->head->val;
}
QDataType QueueBack(Queue* pq)//返回队尾的值
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->tail->val;
}
int QueueSize(Queue* pq)//返回队列中有效值个数
{
assert(pq);
//int size = 0;
//QNode* cur = pq->head;
//while (cur)
//{
// size++;
// cur = cur->next;
//}
//return size;
return pq->size;
}
void TeseQueue()
{
Queue q;
QueueInit(&q);
QueuePush(&q, 1);
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
QueuePush(&q, 5);
QueuePop(&q);
QueuePop(&q);
QueuePop(&q);
QueuePop(&q);
QueuePrint(&q);
printf("%d\n", QueueFront(&q));
printf("%d\n", QueueBack(&q));
if(!QueueEmpty(&q))
printf("%d\n", QueueSize(&q));
QueueDestroy(&q);
}
int main()
{
TeseQueue();
return 0;
}