用程序简单模拟一个单队列多窗口的排队模式:
设某银行有一个固定能容纳N个顾客的等候区,顾客想进银行,若等候区有空则可进,否则被拒绝进入。
每当银行柜员叫号时,等候区中最先进入的顾客离开等候区前往柜台办理业务,若叫号时等候区无人,则此次叫号作废。
输入格式:
第一行输入一个不大于20的正整数N
,表示银行等候区能容纳的人数,
接下来用若干行表示依时间顺序先后发生的“顾客想进银行
”或“叫号
”事件,格式分别是:
顾客想进银行
,用In <id>
表示,其中<id>
是顾客编号,为不大于100000的正整数;叫号
,用Calling
表示。
最后一行是一个#符号,表示输入结束。
注意:
- 题目输入保证每个顾客的编号是独一无二的,即:不会出现想进银行的顾客与已经在等候区的顾客编号相同的情况。
- 保证后一个事件一定在前一个事件完成之后才发生,即:不需要考虑事件之间的“同步”问题。
输出格式:
对于输入的每个事件,按同样顺序在一行内输出事件的结果,格式分别是:
顾客想进银行
,若顾客进入,则输出<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!
这题考察的是基本列队的操作,我用的是的是循环数组的方式操作,比较容易理解,我没在时间内写完所以pta不知道能不能通过,我只通过了样例,要是发现有错误还望指点一下!
代码如下:
#include <stdio.h>
#include<malloc.h>
#include<string.h>
#define MAX 21
typedef int ElementType;
typedef int Position;
typedef struct QNode *PtrToQNode;
struct QNode{
int max;
ElementType id[MAX];
Position Head;
Position Rear;
};
typedef PtrToQNode Queue;
Queue CreateQueue(int x)
{
Queue q;
q=(Queue)malloc(sizeof(struct QNode));
q->Head = q->Rear = 0;
q->max = x+1;//这里采用多使用一个空间作为判断队满条件
return q;
}
void InQueue(Queue q,ElementType s)
{
//下面的if判断队满,前半段是正常情况,后半段是尾在头前面即后面的数组满了在前面插入了数,感觉前半段是多余的
if(q->Rear == q->Head - 1 || (q->Rear - q->Head + q->max) % q->max == q->max - 1){
//if((q->Rear + 1) % q->max == q->Head ){//这段也行,上面的太复杂了
printf("%d rejected.\n",s);
return;
}
q->id[q->Rear] = s;
q->Rear = (q->Rear + 1) % q->max;
printf("%d joined. Total:%d\n",s,(q->Rear - q->Head + q->max) % q->max);
}
void OutQueue(Queue q)
{
if(q->Head == q->Rear){//多用一个空间判断空队比较简单
printf("No one!\n");
return;
}
int a;
a = q->id[q->Head];//保存被call的id
q->Head = (q->Head + 1) % q->max;//头往前移
int length;
length = (q->Rear - q->Head + q->max) % q->max;
printf("%d called. Total:%d\n",a,length);
}
int main(){
Queue q;
ElementType s;
int x;
char n[10];
scanf("%d",&x);
q = CreateQueue(x);
/* strcmp(char *a, char *b)相当于判断a!=b,相等返回0,不相等返回1 */
while(strcmp("#",n)){
scanf("%s",&n);
if(!strcmp("In",n)){
scanf("%d",&s);
InQueue(q,s);
}
if(!strcmp("Calling",n))
OutQueue(q);
if(!strcmp("#",n))
return 0;
}
}