快捷搜索: 王者荣耀 脱发

数据结构学习笔记:队列


前言

本文将了队列的定义,操作,应用和总结等。所举例的为基于数组的循环队列。

ps:为何在进行入队出队的时候不直接让front++和rear++,而是用(front+1)%6和(rear+1)%6?

当用++时,当到了数组最后一个元素的时,再用++即超过了数组范围,而用(front+1)%6和

rear+1)%6能避免这种情况,当加到最后一个再加时,能自动返回到第一个个数组元素。

一、定义

如百科所言,队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,即(先入先出,后入后出)和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

typedef struct  Queue
{
	int front ;//指向队列头部的指针
	int rear;//指向队列尾部的指针
	int* pBase;//指向数组的指针
}QUEUE;

二、操作

1.初始化

初始化队列的数组长度、前后端。

void iniQueue(QUEUE* pQ)
{
	pQ->pBase = (int*)malloc(sizeof(int) * 6);
	pQ->front = 0;
	pQ->rear = 0;
}

2.判断队列是否已满

bool isFull(QUEUE* pQ)
{
	if ((pQ->rear + 1) % 6 == pQ->front)
		return true;
	else
	{
		return false;
	}
}

3.入队

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

4.判断队列是否为空

bool emput_queue(QUEUE* pQ) 
{
	if (pQ->front == pQ->rear) 
	{
		return true;
	}	
	else
	{
		return false;
	}
}

5.出队

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

6.遍历队列

void traverse_queue(QUEUE* pQ) 
{
	int i = pQ->front;
	while (i!=pQ->rear)
	{
		printf("%d
",pQ->pBase[i]);
		i = (i + 1) % 6;  
	}
}

总结

经验分享 程序员 微信小程序 职场和发展