C语言数据结构之顺序队列

C语言数据结构之顺序队列

tips:前些天学习了顺序表和顺序栈,今天来看看c语言数据结构之队列的基本操作。


队列的特点是先进先出,后进后出。因此我们使用一个队头指针和一个队尾指针分别指向队头元素,以及队尾元素的下一个位置。


首先我们创建一个顺序队列的结构体

#define MaxSize 10 //定义队列中最大元素个数

typedef struct {
	int data[MaxSize];//用静态数组存放队列元素
	int front, rear;//队头指针和队尾指针,这里队尾指针指向的是队尾元素的下一个位置	         
	//针对这种队列设计方式:队列中元素的个数:(rear+MaxSize-front)%MaxSize,这会浪费一个存储空间

}Queue,*pQue;

准备顺序队列元素打印函数


//打印队列中的元素
void print_Queue(pQue q)
{
	int head = q->front;
	while (head != q->rear)
	{
		printf("%d\n", q->data[head]);
		head++;
	}
	printf("---------------------------------\n");
}

1、队列的初始化(InitQueue)

//初始化队列
void InitQueue(pQue q)
{
	//初始时,队头和队尾指针都指向0号下标
	q->front = 0;
	q->rear = 0;
}

2、入队(EnQueue)

思路:

  • 当队列满时,不予入队,注意这里队满的判断条件;
  • 当队列未满时,将元素入队,注意rear指针的移动;

具体实现:

//入队
void EnQueue(pQue q, int e)
{
	if ((q->rear+1)%MaxSize==q->front)
	{
		printf("队满!\n");
	}
	else
	{
		q->data[q->rear] = e;
		q->rear =(q->rear+1)%MaxSize;//队尾指针后移(转圈移动)
		//rear始终指向队尾元素的下一个位置
	}
}

3、出队(DeQueue)

思路:

  • 当队空时(front==rear),不予出队;
  • 当队非空时,front指针移动;

具体实现:

//出队
void DeQueue(pQue q)
{
	if (q->front == q->rear) 
	{
		printf("队空!\n");
	}
	else
	{
		q->front = (q->front + 1) % MaxSize;//front指针后移(转圈移动)
	}
}

4、判断队列是否为空(QueueEmpty)

思路:

  • 当front==rear,队列空,返回1;
  • 当front!=rear,队列非空,返回0;

具体实现:

//判断队列是否为空
int QueueEmpty(pQue q)
{
	if (q->front == q->rear)
	{
		return 1;
	}
	else
		return 0;
}

到此,我们就完成了队列的基本操作,还是比较简单的!
我们可以在main()函数中测试一下:

int main()
{
	Queue que;
	pQue q = &que;

	int val;
	char panduan;//判断是否出队(y/n)

	InitQueue(q);

	//循环入队
	while (scanf("%d", &val) != EOF)
	{
		//入队	
		EnQueue(q, val);
	}

	//打印队列元素
	printf("队列中的元素为:\n");
	print_Queue(q);

	while (printf("是否出队?y/n:"), scanf("%c", &panduan) != NULL)
	{
		if (panduan == 'y')
		{
			//出队
			DeQueue(q);

			//打印元素
			print_Queue(q);

			//判断队列是否为空
			if (QueueEmpty(q))
			{
				printf("队列为空!\n");
			}
			else
			{
				printf("队列不为空!\n");
			}

			printf("---------------------------------\n");
		}
		else if (panduan == 'n')
		{
			break;
		}

	}

	return 0;
}

测试结果:
在这里插入图片描述


顺序队列的操作到此已经完成,希望对大家的学习有所帮助,加油!
没有太晚的开始,不如就从今天行动。总有一天,那个一点一点可见的未来,会在你心里,也在你的脚下慢慢清透。生活,从不亏待每一个努力向上的人。

猜你喜欢

转载自blog.csdn.net/wrlovesmile/article/details/108108613