数据结构习题—简单模拟单队列排队(顺序结构循环队列实现)

用程序简单模拟一个单队列多窗口的排队模式:
设某银行有一个固定能容纳N个顾客的等候区,顾客想进银行,若等候区有空则可进,否则被拒绝进入。
每当银行柜员叫号时,等候区中最先进入的顾客离开等候区前往柜台办理业务,若叫号时等候区无人,则此次叫号作废。

输入格式:

第一行输入一个不大于20的正整数N,表示银行等候区能容纳的人数,
接下来用若干行表示依时间顺序先后发生的“顾客想进银行”或“叫号”事件,格式分别是:

  • 顾客想进银行,用 In <id> 表示,其中<id>是顾客编号,为不大于100000的正整数;
  • 叫号,用Calling表示。

最后一行是一个#符号,表示输入结束。
注意:

  1. 题目输入保证每个顾客的编号是独一无二的,即:不会出现想进银行的顾客与已经在等候区的顾客编号相同的情况。
  2. 保证后一个事件一定在前一个事件完成之后才发生,即:不需要考虑事件之间的“同步”问题。

输出格式:

对于输入的每个事件,按同样顺序在一行内输出事件的结果,格式分别是:

  • 顾客想进银行,若顾客进入,则输出 <id> joined. Total:<t> 其中<id>是该顾客的编号,<t>是顾客进入后,等候区的人数
  • 顾客想进银行,若因等候区满而被拒绝,则输出 <id> rejected. 其中<id>是该顾客的编号
  • 叫号,若有顾客前往柜台,则输出 <id> called. Total:<t> 其中<id>是该顾客的编号,<t>是顾客去柜台后,等候区的人数
  • 叫号,等候区无人,则输出 No one!

输入样例:

3
In 101
In 102
In 103
In 104
Calling
In 105
Calling
Calling
Calling
Calling
#

输出样例:

101 joined. Total:1
102 joined. Total:2
103 joined. Total:3
104 rejected.
101 called. Total:2
105 joined. Total:3
102 called. Total:2
103 called. Total:1
105 called. Total:0
No one!

 

用循环队列实现即可,较简单的一道题

代码如下

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

typedef struct Node{  //队列结构体
    int *Data;
    int Front,Rear;
    int MaxSize;
    int Count; //记录队列中现存元素个数
}*Queue;
Queue CreateQueue(int MaxSize){  //创建空队列
    Queue Q=(Queue)malloc(sizeof(struct Node));
    Q->Data=(int*)malloc(sizeof(int)*(MaxSize+1)); //有一个空余空间的循环队列
    Q->Front=Q->Rear=0;
    Q->MaxSize=MaxSize+1;
    Q->Count=0;
    return Q;
}
void AddQ(Queue Q,int id){  //入队操作
    if((Q->Rear+1)%Q->MaxSize==Q->Front){  //队满的情况
        printf("%d rejected.\n",id);
    }
    else{  //队空
        Q->Rear=(Q->Rear+1)%Q->MaxSize;
        Q->Data[Q->Rear]=id;
        Q->Count++;
        printf("%d joined. Total:%d\n",id,Q->Count);
    }
}
void DeleteQ(Queue Q){  //出队操作
    if(Q->Front==Q->Rear)  //队空
        printf("No one!\n");
    else{ //队满
        Q->Front=(Q->Front+1)%Q->MaxSize;
        int id=Q->Data[Q->Front];
        Q->Count--;
        printf("%d called. Total:%d\n",id,Q->Count);
    }
}
int main()
{
    int N;
    scanf("%d",&N);
    char op[10];  //记录操作
    int id; //记录id
    Queue Q=CreateQueue(N);
    while(scanf("%s",op)&&op[0]!='#'){ //当输入#时跳出
        if(op[0]=='I'){  //如果为In操作
            scanf("%d",&id);
            AddQ(Q,id);
        }
        else if(op[0]=='C'){ //Calling操作
            DeleteQ(Q);
        }

    }
    return 0;
}

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值