队列与栈的实现十分相似,栈作为一种“先进后出”的数据结构,队列则是只允许在一端进行插入,在另一端进行删除的线性表,“先进先出”。以下给出C语言中队列的顺序存储方法。
1 通过结构体构造队列
#define MAX 1000
typedef struct Queue//队列构造
{
void *p[MAX];//数据域,数组存储指针(地址)
int size;//队列大小
} Queue;
2 队列初始化
Queue *initQueue()//队列初始化
{
Queue *queue = (Queue *)malloc(sizeof(Queue));//在堆区申请内存
if (queue == NULL)
return NULL; //内存分配失败
memset(queue->p, 0, sizeof(void *) * MAX);//为数组p初始化
queue->size = 0;
return queue;
}
3 入队列
int push(void *data, Queue *queue) //入队列,本质是尾插
{
if (data == NULL || queue == NULL)
return 0; //空指针判断,入队列失败
queue->p[queue->size] = data; //把data插入在队列末位
queue->size++; //队列大小+1
return 1;
}
4 出队列
void *pop(Queue *queue) //出队列,即pop出首个元素
{
if (queue == NULL || queue->size == 0)
return NULL;
void *data = queue->p[0]; //需要出队列的元素
for (int i = 0; i < queue->size - 1; i++)
queue->p[i] = queue->p[i + 1]; //更新队列,剩余的数据地址前移一位
free(queue->p[queue->size-1]);
queue->p[queue->size-1] = NULL;//将原队列末位数据置空
queue->size--; //队列大小减1
return data;
}
5 队列大小与空队列判断
int isEmptyQueue(Queue *queue)//判断队列是否为空
{
if (queue == NULL)
return -1;
return queue->size == 0; //空时返回1
}
int sizeOfQueue(Queue *queue)//返回队列的大小
{
if (queue == NULL)
return -1;
return queue->size;
}
6 函数测试与运行结果
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Student//以队列存储Student类型数据为例
{
int id;
char name[20];
} Student;
int main()
{
Student stu[6] = {
{1, "jakes1"},
{2, "jakes2"},
{3, "jakes3"},
{4, "jakes4"},
{5, "jakes5"},
{6, "jakes6"},
};
Queue *queue = initQueue();//队列初始化
int pushCount = 0;
for (int i = 0; i < 6; i++)
{
push(&stu[i], queue);//入队列
printf("第%d次入队列-->id:%d_name:%s\t 队列大小:%d\t队列为空:%d\t\n", ++pushCount, stu[i].id, stu[i].name, sizeOfQueue(queue), isEmptyQueue(queue));
}
puts("\n");
int popCount = 0;
while (!isEmptyQueue(queue))
{
Student *stu = (Student *)pop(queue);//出队列
printf("第%d次出队列-->id:%d_name:%s\t 队列大小:%d\t队列为空:%d\t\n", ++popCount, stu->id, stu->name, sizeOfQueue(queue), isEmptyQueue(queue));
}
return 0;
}
结果如下: