队列的顺序实现

队列的顺序结构

顺序队列是队列的顺序存储结构,顺序队列实际上也是是运算受限的顺序表

和顺序表一样,顺序队列用一个结构体来存放当前队列中的数据。设置两个指针front和rear(由于队列的队头和队尾的位置是变化)分别指示队头元素和队尾元素在内存中的位置,它们的初值在队列初始化时均应设置为0(空队列)

规则:只允许在一段进行插入,另外一端进行删除的线性表

相关术语:队头、队尾、空队列

特点:先进先出(FIFO)-->first in first out

1>初始化队

定义一个自定义的结构体(静态数组+队头/队尾指针),对其进行重命名方便理解使用。

typedef struct//自定义结构体
{
	int data[MaxSize];//静态的数组存放队列数据
	int front, rear;//指向队头和队尾的指针;
}SeQuence;//对结构体重命名

void InitSeQuence(SeQuence &SQ)
{
	SQ.front = SQ.rear = 0;//空队时队头队尾指向同一位置,队为0
	printf("初始队成功\n");
}

2>判断队是否为满

为什么将判断为满放在前面:

入队前提条件:队存在且有内存空间,如果没有内存空间就不能进行入队操作

定义一个bool型方便调用

bool EnQuence(SeQuence &SQ)
{
	if (SQ.front = SQ.rear)
	{
		printf("当前队列为空!\n");
		return 1;
	}
	if (SQ.front = MaxSize - 1)
	{
		printf("当前队列已满\n");
		return -1;
	}
}

3>入栈

分析:随着数据的不断入栈,队头所指向的位置是不变的第一个数据。但是队尾需要不断的改变去指向不同的数据元素

所以队头指针指向是不变的,队尾指针指向是改变的

void EnterSeQuence(SeQuence &SQ)
{
	if (EmptySeQuence(SQ) == -1)//调用判断空满函数
		printf("队列已满无法入队");
	else
	{
		int n;
		printf("输入入队数据数量:");
		scanf("%d", &n);
		if (n > MaxSize)
		{
			printf("抱歉入栈数据数量超过最大存储空间%d,请重新输入\n", MaxSize);
			scanf("%d", &n);
		}
		printf("入队:");
		int data;//接受数据
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &data);
			SQ.data[SQ.rear] = data;
			SQ.rear++;//队尾指针后移动
		}
		SQ.rear--;//最后一个数据多移动了一位
	}
}

       

4>出队

void GoSeQuence(SeQuence SQ)
{
	if (EmptySeQuence(SQ) == 1)
		printf("当前栈为空!\n");
	printf("出队:");
	while (SQ.rear>=SQ.front)
	{
		printf("%d ",SQ.data[SQ.front]);
		SQ.front++;
	}
	SQ.front = 0;
}

先进先出原则

5>队头队尾元素

void GetElem(SeQuence SQ)
{
	printf("\nfront=%d\t",SQ.data[SQ.front]);
	printf("rear=%d", SQ.data[SQ.rear]);
}

注意输入时最后一个入队元素的指针向后移动一位,如果输入结束后不前移。这里就需要前移一位

6>整体代码

#include<stdio.h>
#define MaxSize 5

typedef struct//自定义结构体
{
	int data[MaxSize];//静态的数组存放队列数据
	int front, rear;//指向队头和队尾的指针;
}SeQuence;//对结构体重命名

void InitSeQuence(SeQuence &SQ)
{
	SQ.front = SQ.rear = 0;//空队时队头队尾指向同一位置,队为0
	printf("初始队成功\n");
}

bool EmptySeQuence(SeQuence SQ)
{
	if (SQ.front == SQ.rear)
		return 1;
	if (SQ.front == MaxSize - 1)
		return -1;
}

void EnterSeQuence(SeQuence &SQ)
{
	if (EmptySeQuence(SQ) == -1)//调用判断空满函数
		printf("队列已满无法入队");
	else
	{
		int n;
		printf("输入入队数据数量:");
		scanf("%d", &n);
		if (n > MaxSize)
		{
			printf("抱歉入栈数据数量超过最大存储空间%d,请重新输入\n", MaxSize);
			scanf("%d", &n);
		}
		printf("入队:");
		int data;//接受数据
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &data);
			SQ.data[SQ.rear] = data;
			SQ.rear++;//队尾指针后移动
		}
		SQ.rear--;//最后一个数据多移动了一位
	}
}

void GoSeQuence(SeQuence SQ)
{
	if (EmptySeQuence(SQ) == 1)
		printf("当前栈为空!\n");
	printf("出队:");
	while (SQ.rear>=SQ.front)
	{
		printf("%d ",SQ.data[SQ.front]);
		SQ.front++;
	}
	SQ.front = 0;
}

void GetElem(SeQuence SQ)
{
	printf("\nfront=%d\t",SQ.data[SQ.front]);
	printf("rear=%d", SQ.data[SQ.rear]);
}

void main()
{
	SeQuence SQ;//声明一个队列
	InitSeQuence(SQ);
	EmptySeQuence(SQ);//判断为空满
	EnterSeQuence(SQ);//入队
	GoSeQuence(SQ);
	GetElem(SQ);
}

猜你喜欢

转载自blog.csdn.net/qq_46861651/article/details/113172741