队列的基本概念
队列的顺序存储
代码语言:javascript复制#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>
#define MAX 100//队列的最大长度为100
//队列结构体
struct queue
{
//创建一个void*类型的指针数组,用来存储用户输入数据的地址
void* array[MAX];
//队列的长度
int size;
};
//隐藏queue结构体,不让用户改变结构体内部的属性-----class类里面的private私有属性
typedef void* seqQueue;
//队列的初始化
seqQueue init_queue()
{
//将队列结构体动态创建在堆区
queue* myqueue = (queue*)malloc(sizeof(queue));
if (myqueue == NULL)
{
return NULL;
}
//清空队列
memset(myqueue->array, NULL, sizeof(void*)*MAX);
//初始化队列
myqueue->size = 0;
return myqueue;
}
//入队:从队尾插入
void push_queue(seqQueue que, void* data)
{
if (que == NULL)
{
return;
}
if (data == NULL)
{
return;
}
//将void*que变为queue*类型方便进行操作
queue* myqueue = (queue*)que;
//查看队列是否已经插满
if (myqueue->size == MAX)
{
return;
}
//本质:数组尾插
myqueue->array[myqueue->size] = data;
//长度更新
myqueue->size ;
}
//出队:头删
void pop_queue(seqQueue que)
{
if (que == NULL)
{
return;
}
queue* myqueue = (queue*)que;
//如果当前队列为空,直接返回
if (myqueue->size == 0)
return;
//不为空进行头部删除:将数组中从第二个元素开始的数据往前都移动一个,从最前面开始,完成删除操作
for (int i = 1; i < myqueue->size; i )
{
myqueue->array[i - 1] = myqueue->array[i];
}
//更新长度
myqueue->size--;
}
//返回队列的大小
int size_queue(seqQueue que)
{
if (que == NULL)
return -1;
queue* myqueue = (queue*)que;
return myqueue->size;
}
//判断队列是否为空
bool empty_queue(seqQueue que)
{
if (que == NULL)
return true;
queue* myqueue = (queue*)que;
if (myqueue->size == 0)
return true;
return false;
}
//返回队头的元素
seqQueue top_queue(seqQueue que)
{
if (que == NULL)
{
return NULL;
}
queue* myqueue = (queue*)que;
if (myqueue->size == 0)
{
return NULL;
}
return myqueue->array[0];
}
//返回队尾的元素
seqQueue back_queue(seqQueue que)
{
if (que == NULL)
{
return NULL;
}
queue* myqueue = (queue*)que;
if (myqueue->size == 0)
{
return NULL;
}
return myqueue->array[myqueue->size-1];
}
//销毁队列
void destory_queue(seqQueue que)
{
if (que == NULL)
{
return;
}
free(que);
que = NULL;
}
//测试------------------------------------------------
struct person
{
char name[32];
int age;
};
void test()
{
person p1 = { "大忽悠",19 };
person p2 = { "like",18 };
person p3 = { "小朋友",19 };
//初始化队列
seqQueue myqueue = init_queue();
//入队
push_queue(myqueue, &p1);
push_queue(myqueue, &p2);
push_queue(myqueue, &p3);
//返回队列的大小
printf("队列的大小:%dn", size_queue(myqueue));
//遍历
while (empty_queue(myqueue)==false)
{
//访问队头
person* pFront=(person*)top_queue(myqueue);
printf("对头元素: %st%dn", pFront->name, pFront->age);
//访问队尾
person* pBack = (person*)back_queue(myqueue);
printf("对尾元素: %st%dn", pBack->name, pBack->age);
//出队
pop_queue(myqueue);
}
//销毁队列
destory_queue(myqueue);
//返回队列的大小
printf("队列的大小:%dn", size_queue(myqueue));
}
int main()
{
test();
return 0;
}