大家好我是小锋,今天我们来学习队列。
队列的概念及结构
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,
队列具有先进先出FIFO(First In First Out)
入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头
我们发现队列刚好与栈相反,那我们下面来实现一个队列
这里我们用链表来实现
实现队列
我们首先要创建一个链表结构,用于存储数据,然后创建一个队列结构用于记录队列的基础数据
我们创建一个链表结构和队列结构的指针,(还是分装在一个测试函数中)
下面我们才开始进行队列操作
初始化
//初始化
void Queueinit(Queue *por) {
assert(por);
por->ps = NULL;
por->pt = NULL;
por->size = 0;
}
队尾入队列
//队尾入队列
void Queuepush(Queue* por, CMMlet n) {
assert(por);
Qnode* cur = (Qnode*)malloc(sizeof(Qnode));
if (cur == NULL) {
printf("%s", trerror(errno));
return 0;
}
cur->sz = n;
cur->next = NULL;
if (por->ps) {
por->pt->next = cur;
por->pt = por->pt->next;
}
else {
assert(por->pt == NULL);
por->ps->next= cur;
por->pt->next= cur;
}
por->size++;
}
对头出队列
//对头出对列
void queuepop(Queue* por) {
assert(por);
//assert(por->ps && por->ps->next);
if (por->ps->next==NULL) {
free(por->ps);
por->ps = NULL;
por->pt = NULL;
}
else {
Qnode* cur = por->ps->next;
free(por->ps);
por->ps = cur;
}
por->size--;
}
获取头部元素
//获取头部元素
CMMlet queuetop(Queue* por) {
assert(por);
assert(Empty(por));
return por->ps->sz;
}
布尔判断
//bool判断
bool Empty(Queue* por) {
assert(por);
return por->size;
}
判断队列是否为空
获取队列中有效元素个数
//获取队列中有效元素个数
int queuesize(Queue* por) {
assert(por);
return por->size;
}
销毁队列
// 销毁队列
void queueDestroy(Queue*por) {
assert(por);
Qnode* cur = por->ps;
while (cur) {
Qnode* add = cur->next;
free(cur);
cur = add;
}
por->ps = NULL;
por->pt = NULL;
por->size = 0;
}
我们可以来测试一下这个队列
下面是本节所有的代码大家可以试试
# define _CRT_SECURE_NO_WARNINGS
# include<stdio.h>
# include<assert.h>
# include<stdlib.h>
# include<string.h>
# include<errno.h>
# include<stdbool.h>
typedef struct Qlistnode Qnode;
typedef struct Queue Queue;
typedef int CMMlet;
//队列实现
//
//链表结构
struct Qlistnode {
CMMlet sz;//存储的数据
struct Qlistnode* next;//下个节点
};
//队列结构
struct Queue {
Qnode *ps;//队头
Qnode *pt;//队尾
int size;//队列元素个数
};
//初始化
void Queueinit(Queue *por) {
assert(por);
por->ps = NULL;
por->pt = NULL;
por->size = 0;
}
//bool判断
bool Empty(Queue* por) {
assert(por);
return por->size;
}
//队尾入队列
void queuepush(Queue* por, CMMlet n) {
assert(por);
Qnode* cur = (Qnode*)malloc(sizeof(Qnode));
if (cur == NULL) {
printf("%s", strerror(errno));
return;
}
cur->sz = n;
cur->next = NULL;
if (por->ps) {
por->pt->next = cur;
por->pt = por->pt->next;
}
else {
assert(por->pt == NULL);
por->ps= cur;
por->pt= cur;
}
por->size++;
}
//对头出对列
void queuepop(Queue* por) {
assert(por);
//assert(por->ps && por->ps->next);
if (por->ps->next==NULL) {
free(por->ps);
por->ps = NULL;
por->pt = NULL;
}
else {
Qnode* cur = por->ps->next;
free(por->ps);
por->ps = cur;
}
por->size--;
}
//获取头部元素
CMMlet queuetop(Queue* por) {
assert(por);
assert(Empty(por));
return por->ps->sz;
}
//获取队列中有效元素个数
int queuesize(Queue* por) {
assert(por);
return por->size;
}
// 销毁队列
void queueDestroy(Queue*por) {
assert(por);
Qnode* cur = por->ps;
while (cur) {
Qnode* add = cur->next;
free(cur);
cur = add;
}
por->ps = NULL;
por->pt = NULL;
por->size = 0;
}
//打印队列
void queuedy(Queue* por) {
Qnode* cur = por->ps;
printf("队头->");
while (cur) {
printf("%d->", cur->sz);
cur = cur->next;
}
printf("->队尾\n");
}
//测试函数
void queuecs() {
Qnode* head = NULL;
Queue pead;
Queueinit(&pead);
queuepush(&pead, 1);
queuepush(&pead, 2);
queuepush(&pead, 3);
queuepush(&pead, 4);
queuepush(&pead, 5);
queuedy(&pead);
queuepop(&pead);
queuepop(&pead);
queuepop(&pead);
queuedy(&pead);
int n = queuetop(&pead);
printf("%d\n",n);
n = queuesize(&pead);
printf("%d\n", n);
queueDestroy(&pead);
}
int main() {
queuecs();
return 0;
}
以上就是全部内容了,如果有错误或者不足的地方欢迎大家给予建议。