队列基本概念和顺序式存储实现

2021-03-05 10:17:44 浏览数 (1)

队列的基本概念

队列的顺序存储

代码语言: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;
}

0 人点赞