目录
一、引言
感谢宝子们一键三连支持,火速更新中~~
队列,是一种线性表,在表中满足先进先出操作(FIFO)。在队头删除,在队尾插入。
二、目的
1. 掌握顺序队列的存储结构
2. 掌握顺序队列的基本操作
3. 掌握顺序队列的基本特性
三、环境与设备
1.操作系统:Windows 10
2.编译器:Visual Studio 2021
四、存储结构
typedef int DataType;
typedef struct
{
DataType data[MAX];
int front,rear;
}SeqQueue;
五、函数
2. void InitSeqQueue(SeqQueue *L)//初始化队列
3. int Empty(SeqQueue *L)//判空
4. int Full(SeqQueue *L)//判满
5. int InQueue(SeqQueue *L,DataType x)//入队列
6. DataType OutQueue(SeqQueue *L)//出队列
7. DataType GetQueue(SeqQueue *L)//读取队头元素
8. int Length(SeqQueue *L)//求长度
9. void DisQueue(SeqQueue *L)//显示队列元素
六、核心代码
代码如下,实现了队列的初始化、判空、判满、入队列、出队列、读取对头元素、求长度、显示队列元素操作。
#include<stdio.h>
#include<stdlib.h>
#define MAX 10
typedef int DataType;
typedef struct
{
DataType data[MAX];
int front,rear;
}SeqQueue;
SeqQueue L;
void InitSeqQueue(SeqQueue *L);//初始化队列
int Empty(SeqQueue *L);//判空
int Full(SeqQueue *L);//判满
int InQueue(SeqQueue *L,DataType x);//入队列
DataType OutQueue(SeqQueue *L);//出队列
DataType GetQueue(SeqQueue *L);//读取队头元素
int Length(SeqQueue *L);//求长度
void DisQueue(SeqQueue *L);//显示队列元素
void menu();
void menu1();
int main()
{
menu();
}
//初始化队列
void InitSeqQueue(SeqQueue *L)
{
L->front=0;
L->rear=0;
}
//判空
int Empty(SeqQueue *L)
{
if(L->front==L->rear)
{
printf("为空");
}
else
{
printf("不为空");
return 0;
}
}
//判满
int Full(SeqQueue *L)
{
if((L->rear+1)%MAX==L->front)
{
printf("空间已满");
}
else
{
printf("没有满");
}
}
//入队列
int InQueue(SeqQueue *L,DataType x)
{
if((L->rear+1)%MAX==L->front)
{
printf("空间已满");
}
else
{
L->rear=(L->rear+1)%MAX;
L->data[L->rear]=x;
printf("入队成功\n");
}
}
//出队列
DataType OutQueue(SeqQueue *L)
{
if(L->front==L->rear)
{
printf("空表");
}
{
L->front=(L->front+1)%MAX;
printf("当前出队列元素为:\n");
printf("%d\t",L->data[L->front]);
}
}
//读取队头元素
DataType GetQueue(SeqQueue *L)
{
if(L->front==L->rear)
{
printf("没有值");
}
else
{
printf("当前队头元素为:\n");
printf("%d\n",L->data[(L->front+1)%MAX]);
}
}
//求长度
int Length(SeqQueue *L)
{
int count=0;
count=(L->rear-L->front+MAX)%MAX;
return count;
}
//显示队列元素
void DisQueue(SeqQueue *L)
{
printf("当前队列元素为:\n");
for(int i=0,j=L->front;i<Length(L);i++)
{
j=(j+1)%MAX;
printf("%d\t",L->data[j]);
}
printf("\n");
}
void menu()
{
system("mode con cols=80 lines=45");
system("color 30");
printf("\t---------------------------------------------------------------\n");
printf("\t* 顺序队列 *\n");
printf("\t---------------------------------------------------------------\n");
printf("\t*\t\t 1.初始化队列 *\n");
printf("\t*\t\t 2.判空 *\n");
printf("\t*\t\t 3.判满 *\n");
printf("\t*\t\t 4.入队列 *\n");
printf("\t*\t\t 5.出队列 *\n");
printf("\t*\t\t 6.读取队头元素 *\n");
printf("\t*\t\t 7.求长度 *\n");
printf("\t*\t\t 8.显示队列元素 *\n");
printf("\t---------------------------------------------------------------\n");
printf("\t\t请选择功能\n");
int a;
scanf("%d",&a);
while(a)
{
switch(a)
{
case 1:InitSeqQueue(&L);printf("初始化成功\n");break;
case 2:
{
if(Empty(&L)) printf("当前队列为空\n");
else printf("当前队列不为空\n");
break;
}
case 3:
{
if(Full(&L)) printf("当前队列以满\n");
else printf("当前队列未满\n");
break;
}
case 4:
{
int x=0;
printf("请输入入队元素\n");
scanf("%d",&x);
InQueue(&L,x);
break;
}
case 5:OutQueue(&L);break;
case 6:GetQueue(&L);break;
case 7:
{
int count=Length(&L);
printf("队列长度为:%d\n",count);
break;
}
case 8:DisQueue(&L);break;
case 9:menu1();break;
default:printf("输入错误,请重新输入!!!!\n");
}
printf("\t\t请选择功能\n");
printf("\t\t温馨提示输入9可查看菜单\n");
scanf("%d",&a);
system("cls");
}
}
void menu1()
{
system("mode con cols=80 lines=45");
system("color 30");
printf("\t---------------------------------------------------------------\n");
printf("\t* 顺序队列 *\n");
printf("\t---------------------------------------------------------------\n");
printf("\t*\t\t 1.初始化队列 *\n");
printf("\t*\t\t 2.判空 *\n");
printf("\t*\t\t 3.判满 *\n");
printf("\t*\t\t 4.入队列 *\n");
printf("\t*\t\t 5.出队列 *\n");
printf("\t*\t\t 6.读取队头元素 *\n");
printf("\t*\t\t 7.求长度 *\n");
printf("\t*\t\t 8.显示队列元素 *\n");
printf("\t---------------------------------------------------------------\n");
}
七、调试界面
八、总结
可以有效的利用资源,用数组队实现队列时,如果不移动,随着数据的不断读写,会出现假满队列的情况。即尾数组已满但头数组还是空的;循环队列也是一种数组,只是它在逻辑上把数组的头和尾相连,形成循环队列,当数组尾满的时候,要判断数组头是否为空,不为空继续存放数据。循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"是"满"。