实验三 队列及其应用
一、实验目的
1.掌握队列的抽象数据类型描述及特点。
2.掌握队列的顺序和链式存储结构与基本算法实现。
3.掌握队列在实际问题中的应用和基本编程技巧。
二、实验内容
1. 队列在不同存储结构上进行插入、删除等操作的算法。
2. 通过队列解决现实中的一些问题。
三、实验过程
1、实验题目
[问题描述]
根据队列的数据结构,建立一个队列,利用队列实现如下其中一个应用:
(1)银行业务队列简单模拟。设某银行有A、B两个业务窗口,其中A窗口的处理速度是B窗口的2倍,给定到达银行的顾客序号,请按业务完成的顺序输出顾客序列(假设奇数编号到A窗口办理,偶数编号到B窗口办理,不同窗口同时处理完2个顾客,A窗口优先输出)。
[基本要求]
(1)按实验内容编写完整的程序,并上机验证。
(2)实验完成后,提交电子档教师验收程序,并提交填写好的实验报告。
[测试数据]
由学生依据软件工程的测试技术自己确定。注意测试边界数据。
此节代码展示的是银行两个窗口办理业务的顺序
#include<stdio.h>
#include<stdlib.h>
//#define false 0;
//#define true 1;
#define maxsize 1001
typedef struct st{
int front,rear,middle;
int data[maxsize];
};
typedef struct st *Qnode;
typedef Qnode queue;
//判空
//int Empty(queue *Q)
//{
// if(Q->front==Q->rear)
// return 1;
// else
// return 0;
// }
//删除头
//int deque(queue *Q,int x)
//{
// if(Q->front==Q->rear)
// return false;
// x=Q->data[Q->front];
// Q->front=(Q->front+1)%maxsize;
// return true;
// }
//判奇偶
void oddeven(queue q1,queue q2)
{
printf("请输入顾客总数:\n");
int n;
scanf("%d",&n);
printf("请依次输入%d个顾客编号:\n",n);
while(n--)
{
int m;
scanf("%d",&m);
if(m%2)
{
q1->data[q1->rear]=m;
q1->rear++;
printf("编号%d已存入q1\n",m);
}
else
{
q2->data[q2->rear]=m;
q2->rear++;
printf("编号%d已存入q2\n",m);
}
}
}
//依次输出两个奇数,一个偶数
int output(queue q1,queue q2)
{
int x=1;
while(q1->front!=q1->rear)//由于q1为奇数是先输出先结束的队列,所以这里以q1作为循环条件
{
int cnt=2;//已知奇数速度是偶数的二倍,我以cnt来表示输出两个奇数,再一个输出偶数
// int i=0;//用i来决定是否输出空格
while(cnt--&&q1->front!=q1->rear)
{
// if(i++) //即第一个位置前没有空格,其余位置前均有
// printf(" ");
printf("编号%d的为第%d个顾客\n",q1->data[q1->front],x++);
q1->front++;
}
if(q2->front!=q2->rear)
{
printf("编号%d的为第%d个顾客\n",q2->data[q2->front],x++);
q2->front++;
}
}
// int w=0;
while(q2->front!=q2->rear){
//如果奇数输出完了还有偶数就让偶数输出
// if(w++)
// printf(" ");
printf("编号%d的为第%d个顾客\n",q2->data[q2->front],x++);
q2->front++;
}
return 0;
}
int main()
{
queue q1,q2;
q1=(queue)malloc(sizeof(queue));
q2=(queue)malloc(sizeof(queue));
q1->front=q1->rear=q2->rear=q2->front=0;
q1->middle=q2->middle=0;
oddeven(q1,q2);
output(q1,q2);
return 0;
}
运行测试: