队列(程序) 郝斌老师-数据结构

版权声明:本文为博主原创文章,未经博主允许不得转载! https://blog.csdn.net/weixin_42839965/article/details/82254850

定义结构体
typedef struct Queue
{
int *pBase;
int front;
int rear;
}QUEUE;

这里写图片描述

队列初始化

void init(QUEUE *pQ)
{//将pQ->pBase当做数组的首地址处理
	pQ->pBase=(int *)malloc(sizeof(int) * 6);// 假设队列的长度是6,pQ->pBase成员有实际含义,指向24个字节的数组
	pQ->front = 0;
	pQ->rear = 0;
}

入队
入队之前先要判断队列是否为满,未满才能入队,否则不能;


循环队列入队伪算法讲解
		两步完成:
			1、将元素存入r代表的位置;
			2、将r的上移一位
				表达式:r=(r+1)%数组的长度
bool en_queue(QUEUE *pQ, int val)
{
	if (full_queue(pQ))
		return false;
	else
	{
		pQ->pBase[pQ->rear] = val;
		pQ->rear = (pQ->rear + 1) % 6;
		return true;
	}
		
}

判断队列是否为满

如何判断循环队列是否已满
		预备知识:
			front与rear的值的大小不确定,可大可小可相等;
			若数组有六个元素,每个元素都要使用,当front与rear相等时,无法确定队列为空还是满;
			两种判断方式:
				1、加一个标识参数,表示数组长度;
				2、少用一个元素位置(如n个存放位置,存放(n-1)个元素)若front与rear紧挨,则队列已满;
				用C语言伪算法表示就是:
					if((r+1/数组长度== f)//rear往后移动一位是front的判别方法,逆时针
						已满;
					else
						不满;
bool full_queue(QUEUE *pQ)
{
	if ((pQ->rear + 1) % 6 == pQ->front)
		return true;
	else
		return false;
}

遍历队列

//遍历从front开始,所以可以先定义一个参数,这个参数就是头部,
//只要参数没有指向rear就输出,然后往后移动,只要参数和rear相等,就不需要输出
void traverse_queue(QUEUE *pQ)
{
	int i = pQ->front;
	while(i != pQ->rear)
	{
		printf("%d  ", pQ->pBase[i]);
		i = (i + 1) % 6;
	}
	printf("\n");
	return;
}

假设了队列是六个单位长度,遍历之后输出:
少用一个元素位置(如n个存放位置,存放(n-1)个元素)若front与rear紧挨,则队列已满;

int main(void)
{
	QUEUE Q;
	int val;
	init(&Q);//不加取地址符,初始化无法改变结构体定义中三个变量的值
	en_queue(&Q, 1);
	en_queue(&Q, 2);
	en_queue(&Q, 3);
	en_queue(&Q, 4);
	en_queue(&Q, 5);
	en_queue(&Q, 6);

	traverse_queue(&Q);
	if (out_queue(&Q, &val))
	{
		printf("出队成功,出队的元素是: %d\n", val);
	}
	else
	{
		printf("出队失败!\n");
	}
	traverse_queue(&Q);

	return 0;
}

这里写图片描述

删除元素f的表达式:
	f=(f+1)%队列长度;
队列的具体应用:
	所有和时间有关的操作都与队列有关

附录:

#include<stdio.h>
#include<malloc.h>

typedef struct Queue
{
	int *pBase;
	int front;
	int rear;
}QUEUE;
void init(QUEUE *);//初始化
bool en_queue(QUEUE *, int val);//入队,QUEUE *存放的队列,val存放的值
void traverse_queue(QUEUE *);//遍历队列
bool full_queue(QUEUE *);//判断队列是否为满
bool out_queue(QUEUE *, int *pVal);//出队
bool emput_queue(QUEUE *);//判断队列是否为空

int main(void)
{
	QUEUE Q;
	int val;
	init(&Q);//不加取地址符,初始化无法改变结构体定义中三个变量的值
	en_queue(&Q, 1);
	en_queue(&Q, 2);
	en_queue(&Q, 3);
	en_queue(&Q, 4);
	en_queue(&Q, 5);
	en_queue(&Q, 6);

	traverse_queue(&Q);
	if (out_queue(&Q, &val))
	{
		printf("出队成功,出队的元素是: %d\n", val);
	}
	else
	{
		printf("出队失败!\n");
	}
	traverse_queue(&Q);

	return 0;
}
void init(QUEUE *pQ)
{//将pQ->pBase当做数组的首地址处理
	pQ->pBase=(int *)malloc(sizeof(int) * 6);// 假设队列的长度是6,pQ->pBase成员有实际含义,指向24个字节的数组
	pQ->front = 0;
	pQ->rear = 0;
}

bool en_queue(QUEUE *pQ, int val)
{
	if (full_queue(pQ))
		return false;
	else
	{
		pQ->pBase[pQ->rear] = val;
		pQ->rear = (pQ->rear + 1) % 6;
		return true;
	}
		
}

bool full_queue(QUEUE *pQ)
{
	if ((pQ->rear + 1) % 6 == pQ->front)
		return true;
	else
		return false;
}
//遍历从front开始,所以可以先定义一个参数,这个参数就是头部,
//只要参数没有指向rear就输出,然后往后移动,只要参数和rear相等,就不需要输出
void traverse_queue(QUEUE *pQ)
{
	int i = pQ->front;
	while(i != pQ->rear)
	{
		printf("%d  ", pQ->pBase[i]);
		i = (i + 1) % 6;
	}
	printf("\n");
	return;
}
bool emput_queue(QUEUE *pQ)
{
	if (pQ->front==pQ->rear)
		return true;
	else
		return false;
}
bool out_queue(QUEUE *pQ, int *pVal)
{
	if (emput_queue(pQ))
		return false;
	else
	{
		*pVal = pQ->pBase[pQ->front];
		pQ->front = (pQ->front + 1) % 6;
		return true;
	}
		

}

猜你喜欢

转载自blog.csdn.net/weixin_42839965/article/details/82254850