队列的顺序结构
顺序队列是队列的顺序存储结构,顺序队列实际上也是是运算受限的顺序表。
和顺序表一样,顺序队列用一个结构体来存放当前队列中的数据。设置两个指针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);
}