数据结构实验二(C语言):银行排队系统
银行排队系统
银行排队系统
【问题描述】假设银行只有2个窗口对外营业,顾客到银行办理业务,首先要取一个顺序号,然后排队等待叫号。被叫到号的顾客到柜台接受服务,服务完毕后离开。到了下班时间不再接收新来的顾客。顾客分为普通顾客和VIP顾客,VIP顾客有优先权,即可以先得到服务。编一算法模拟银行的每个窗口一天各有多少顾客接受了服务,其中有多少个VIP顾客;并按逆序输出接受服务的普通顾客和VIP顾客的顺序号。
【问题分析】
顾客到银行办理业务,必须按照先来先得到服务的原则,因此可以把顾客信息用一个队列来存储,顾客到达后先取号,然后进入队列(插入队尾)等待;被叫到号的顾客接受服务,然后离开(队头元素出列);银行下班后不再接收新来的顾客,即将队列中的元素依次出队列。VIP顾客可以优先得到服务,即可以把VIP顾客单独放在一个队列中,当顾客需要接受服务时 ,首先判断VIP队列是否为空,如不为空,则VIP队列的第一个顾客接受服务;当为空时,则普通队列的第一个顾客接受服务。到达银行的顾客的顺序号随机产生(1-100之间)。顾客的等级也可随机产生(比如;1表示VIP顾客;0表示普通顾客)。设置命令:A表示顾客到达银行;D表示顾客离开银行;P表示下班不再接收新顾客。为了逆序输出已接受服务的顾客顺序号,可以设置一个栈,在顾客接受完服务后,将顾客的顺序号存入栈中,待下班后,依次取出栈中元素并输出,即为所求。
【实现提示】
本题采用2个带头结点的链队列和一个顺序栈作为存储结构。
输入设计:当输入命令A时,进行入队操作;当输入D时,进行出队操作;当输入P时,如果排队队列不空,则依次删除所有元素。在删除元素的过程中,把删除的元素同时入栈,并计数。
输出设计:输出进入银行排队的总人数和逆序输出排队的顾客顺序号。
说明:可以不按“实现提示”做,由自己任意发挥。
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct node
{
///结点构造
int date;///顾客顺序号
struct node *next;///指针域
} LinkQnode;
typedef struct
{
///链队列结构
LinkQnode *front;///队头指针
LinkQnode *rear;///队队尾指针
} LinkQueue;
typedef struct/**顺序栈结构**/
{
int *base;
int *top;
int Stacksize;
} SeqStack;
void InitLinkQueue(LinkQueue *Q1, LinkQueue *Q2)
{
Q1->front = (LinkQnode *)malloc(sizeof(LinkQnode));
Q1->rear = Q1->front;
Q1->front->next = NULL;
Q2->front = (LinkQnode *)malloc(sizeof(LinkQnode));
Q2->rear = Q2->front;
Q2->front->next = NULL;
}
void InitStack(SeqStack *S)
{
S->base = (int *)malloc(100 * sizeof(int));
if(!S->base)
printf("空间已满\n");
else
{
S->top = S->base;
S->Stacksize = 100;
}
}
int EnLinkQueue(LinkQueue *Q, int x)
{
LinkQnode *Newnode;
Newnode = (LinkQnode *)malloc(sizeof(LinkQnode));
if(Newnode != NULL)
{
Newnode->date = x;
Newnode->next = NULL;
Q->rear->next = Newnode;
Q->rear = Newnode;
printf("序号为%d的顾客进入\n", Q->rear->date);
return 1;
}
else
return 0;
}
int DeLinkQueue(LinkQueue *Q, int *x)
{
LinkQnode *p;
if(Q->front == Q->rear)
return 0;
p = Q->front->next;
Q->front->next = p->next;
if(Q->rear == p)
{
Q->rear = Q->front;
}
*x = p->date;
free(p);
return 1;
}
int Push(SeqStack *S, int x)
{
if(S->top - S->base == S->Stacksize)
{
S->base = (int *)realloc(S->base, (S->Stacksize + 10) * sizeof(int));
if(S->base == NULL)
return 0;
S->top = S->base + S->Stacksize;
S->Stacksize = S->Stacksize + 10;
}
*S->top = x;
S->top++;
return 1;
}
int IsLQEmpty(LinkQueue *Q)
{
if(Q->front == Q->rear)
return 1;
else
return 0;
}
int IsEmpty(SeqStack *S)
{
if(S->top == S->base)
return 1;
else
return 0;
}
int Pop(SeqStack *S, int *x)
{
if(S->top == S->base)
return 0;
else
{
S->top--;
*x = *S->top;
return 1;
}
}
void Process(LinkQueue *Q1, LinkQueue *Q2, SeqStack *S)
{
char ch;
int flag, sum = 0, ans = 1, cnt = 0;
int num1=0,num2=0,num=0;
printf("------------------银行排队系统模拟------------------\n");
printf(" A--表示顾客到达\n D--表示顾客离开\n P--表示停止顾客进入\n");
printf("1表示顾客属于VIP顾客,0表示顾客属于普通顾客\n");
printf("请输入:A/D/P及0/1\n");
flag = 1;
while(flag)
{
cin >> ch;
switch(ch)
{
case 'A':
cin >> cnt;
if(ans <= 2)
{
num1++;
num2++;
num++;
if(cnt == 1)
{
EnLinkQueue(Q1, num1);
Push(S, num);
printf("顾客号为%d的VIP顾客正在接受服务\n", num1);
//break;
}
else if(cnt == 0)
{
EnLinkQueue(Q2, num2);
Push(S, num1);
printf("顾客号为%d的普通顾客正在接受服务\n", num2);
//break;
}
ans++;
break;
}
else if(ans > 2)
{
if(cnt == 0)
{
num++;
EnLinkQueue(Q2, num);
printf("请顺序号为%d的普通顾客等待\n", num);
//break;
}
else if(cnt == 1)
{
num++;
EnLinkQueue(Q1, num);
printf("请顺序号为%d的VIP顾客等待\n", num);
//break;
}
}
break;
case 'D':
if(!IsLQEmpty(Q1))//
{
DeLinkQueue(Q1,&num);
sum=sum+1;///已接受服务的顾客数
printf("请序号为%d的VIP顾客离开\n",num);
Push(S,num);
}
else if(IsLQEmpty(Q1)&&(!IsLQEmpty(Q2)))
{
DeLinkQueue(Q2,&num);
sum=sum+1;
printf("请序号为%d的普通顾客离开\n",num);
}
else if(IsLQEmpty(Q1)&&IsLQEmpty(Q2))
{
printf("无顾客排队\n");
}
break;
case 'P':
printf("停止顾客进入\n");
printf("还在排队的顾客有:\n");
while(!IsLQEmpty(Q1))
{
DeLinkQueue(Q1,&num);
printf("还在排队的VIP顾客号%d\n",num);
sum=sum+1;
Push(S,num);
}
while(!IsLQEmpty(Q2))
{
DeLinkQueue(Q2,&num);
printf("还在排队的普通顾客号%d\n",num);
sum=sum+1;
Push(S,num);
}
flag=0;
break;
}
}
printf("到达银行的顾客人数为%d\n",sum);
while(!IsEmpty(S))
{
Pop(S,&num);
printf("第%d位顾客,序号为%d\n",sum,num);
sum--;
}
}
int main()
{
LinkQueue *Q1, *Q2;
SeqStack *S;
Q1 = (LinkQueue *)malloc(sizeof(LinkQueue));
Q2 = (LinkQueue *)malloc(sizeof(LinkQueue));
S = (SeqStack *)malloc(sizeof(SeqStack));
InitLinkQueue(Q1, Q2);
InitStack(S);
Process(Q1, Q2, S);
return 0;
}
更多推荐
所有评论(0)