顺序队

一.队列

队列是一种具有先进先出(FIFO)特性的线性数据结构,它只允许在队列的两端进行插入和删除操作。队列的一端称为队尾(rear),另一端称为队头(front)。新元素总是插入在队列的队尾,而从队列中删除元素时则总是删除队头元素。

由于队列具有FIFO特性,因此队列通常用于需要按照顺序处理数据的场景,比如任务调度、消息传递等。队列有两种基本操作:入队(enqueue)和出队(dequeue)。当一个元素被插入到队列的队尾时,我们称之为入队操作;当一个元素被从队列的队头删除时,我们称之为出队操作。除了入队和出队操作以外,队列还有其他一些常见的操作,例如获取队头元素(peek)、判空(isEmpty)等。

二.题目要求

由于现实中的银行排队问题比较复杂,难以简单实现,博主这里主要是为了练习队列的相关操作,所以这里简单模拟一下即可。它应该包含以下功能:

  • 添加客户:可以添加新的客户到队列中等待服务。

  • 删除客户:当银行柜员完成服务之后,需要将客户从队列中删除。

  • 显示队列:可以展示当前在队列中等待服务的客户列表。

三.各部分功能及实现

1.定义结构体

采用顺序存储结构的队列称为顺序队

#define MaxSize 100

//定义号码牌结构表
typedef struct {
	char name[20];
	int num;
} Elemtype;

//定义循环顺序队列结构体
typedef struct
{
	Elemtype data[MaxSize];                            //存放队中元素
	int front,rear;                                    //队头和队尾的伪指针
}SqQueue; 

2.初始化队列

构造一个空队列,将front和rear指针均设置为初始状态。即-1。

//初始化队列
void InitQueue(SqQueue *&q)
{
	q=(SqQueue *)malloc(sizeof(SqQueue));       //申请一个顺序队大小的空队列空间   
	q->front=q->rear=0;                        //队头和队尾的伪指针均设置伪-1
}

3.队列其他操作

销毁队列:释放队列q占用的存储空间。

队列判空:队列为空,返回真;否则返回假。

//销毁队列
void DestroyQueue(SqQueue *&q)
{
	free(q);                               //释放q所占的空间即可
}

//判断空队列
bool QueueEmpty(SqQueue *q)
{
	return (q->front==q->rear);
}

4.进队

在队列q不满的情况下先将队尾指针rear增1,然后将元素插入该位置。

//进队列
bool enQueue(SqQueue *&q,Elemtype e)
{
	if((q->rear+1)%MaxSize==q->front)            //队满上溢出报错
		return false;
	q->rear=(q->rear+1)%MaxSize;                 //队尾增1
	q->data[q->rear]=e;                         //rear位置插入元素e
	return true;
}

5.出队

在队列不为空的条件下先将队头指针front增1,并将该位置的元素值赋给e。

//出队列
bool deQueue(SqQueue *&q,Elemtype &e)
{
	if(q->rear==q->front)                                //队空下溢出报错
		return false;
	q->front=(q->front+1)%MaxSize;                      //队头增1
	e=q->data[q->front];
	return true;
}

6.叫号程序

显示当前队列,核心算法

//叫号程序
bool displist(SqQueue *&q)
{
	
	int i=q->front;
	if(q->rear==q->front)                                //队空下溢出报错
		return false;
	printf("排队叫号次序:\n");
	while(i!=q->rear)
	{
		i++;
		printf("%d\t%s\n",q->data[i].num,q->data[i].name);
	}
	printf("---------------- \n");
	return true;
}

7.菜单实现

比较基础,重在整理

//菜单实现
void menu() {
	printf("      银行叫号的应用模拟:\n");
	printf("   -------------------------------\n");
	printf("      1.建立(初始化)队列\n");
	printf("      2.取号业务办理\n");
	printf("      3.叫号业务办理\n");
	printf("      4.查看排队信息\n");
	printf("      5.下班,不进行业务办理\n");
	printf("      6.退出程序!!!\n");
	printf("   -------------------------------\n");
}

四.C语言实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MaxSize 100

//定义号码牌结构表
typedef struct {
	char name[20];
	int num;
} Elemtype;

//定义循环顺序队列结构体
typedef struct
{
	Elemtype data[MaxSize];                            //存放队中元素
	int front,rear;                                    //队头和队尾的伪指针
}SqQueue;                                              //顺序队类型

//初始化队列
void InitQueue(SqQueue *&q)
{
	q=(SqQueue *)malloc(sizeof(SqQueue));       //申请一个顺序队大小的空队列空间   
	q->front=q->rear=0;                        //队头和队尾的伪指针均设置伪-1
}

//销毁队列
void DestroyQueue(SqQueue *&q)
{
	free(q);                               //释放q所占的空间即可
}

//判断空队列
bool QueueEmpty(SqQueue *q)
{
	return (q->front==q->rear);
}

//进队列
bool enQueue(SqQueue *&q,Elemtype e)
{
	if((q->rear+1)%MaxSize==q->front)            //队满上溢出报错
		return false;
	q->rear=(q->rear+1)%MaxSize;                 //队尾增1
	q->data[q->rear]=e;                         //rear位置插入元素e
	return true;
}

//出队列
bool deQueue(SqQueue *&q,Elemtype &e)
{
	if(q->rear==q->front)                                //队空下溢出报错
		return false;
	q->front=(q->front+1)%MaxSize;                      //队头增1
	e=q->data[q->front];
	return true;
}

//叫号程序
bool displist(SqQueue *&q)
{
	
	int i=q->front;
	if(q->rear==q->front)                                //队空下溢出报错
		return false;
	printf("排队叫号次序:\n");
	while(i!=q->rear)
	{
		i++;
		printf("%d\t%s\n",q->data[i].num,q->data[i].name);
	}
	printf("---------------- \n");
	return true;
}

//菜单实现
void menu() {
	printf("      银行叫号的应用模拟:\n");
	printf("   -------------------------------\n");
	printf("      1.建立(初始化)队列\n");
	printf("      2.取号业务办理\n");
	printf("      3.叫号业务办理\n");
	printf("      4.查看排队信息\n");
	printf("      5.下班,不进行业务办理\n");
	printf("      6.退出程序!!!\n");
	printf("   -------------------------------\n");
}

//主程序
int  main()
{
	int flag=1,i,j;
	int count=4;
	Elemtype e,pno;
	Elemtype a[4] = {"张三", 1, "李四", 2, "王五", 3, "赵六", 4};
	SqQueue *p;
	menu();
	InitQueue(p);
	while(flag==1)
	{
		printf("请选择:\n");
		scanf("%d",&i);
		switch(i)
		{
		case 1:
			for( j=0;j<4;j++)
			{
				e=a[j];
				enQueue(p,e);	
			}
		    break;
		case 2:
		    count++;
			printf("请输入客户姓名:\n");
			scanf("%s",pno.name);
			pno.num=count;
			enQueue(p,pno);
			break;
		case 3:
			deQueue(p,e);
			printf("正在办理业务的客户为:%d\t%s\n",e.num,e.name);
			break;
		case 4:
			displist(p);
			printf("\n");
			break;
		case 5:
			printf("下班,不进行业务办理\n");
			break;
		case 6:
			flag=0;
			printf("退出程序");
			break;
		}
	}
	return 0;
}

五.运行结果

j0Hb.jpg

欢迎收看博主其他系列的文章!

posted @   挽留岁月挽留你  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
  1. 1 原来你也在这里 周笔畅
  2. 2 世间美好与你环环相扣 柏松
  3. 3 起风了 吴青峰
  4. 4 极恶都市 夏日入侵企划
世间美好与你环环相扣 - 柏松
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 尹初七

作曲 : 柏松

编曲 : 彭圣杰

偏偏秉烛夜游

偏偏秉烛夜游

午夜星辰 似奔走之友

爱你每个结痂伤口

酿成的陈年烈酒

入喉尚算可口

入喉尚算可口

怎么泪水 还偶尔失守

邀你细看心中缺口

裂缝中留存 温柔

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

知道你不能 还要你感受

知道你不能 还要你感受

让星光加了一点彩虹

让樱花偷偷 吻你额头

让世间美好 与你环环相扣

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

知道你不能 还要你感受

知道你不能 还要你感受

让星光加了一点彩虹

当樱花开的纷纷扬扬

当世间美好 与你环环相扣

特别鸣谢:槿葵,我们的海报制作妹妹。

原唱:柏松

吉他:柏松

和声:柏松

录音:柏松

混音:张强

点击右上角即可分享
微信分享提示