数据结构与算法-队列的顺序存储操作及应用C语言实现(超详细注释/设计/实验/作业)

一、引言

感谢宝子们一键三连支持,火速更新中~~
队列,是一种线性表,在表中满足先进先出操作(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来判别队列是"空"是"满"。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员老茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值