数据结构与算法实战_简单模拟单队列排队_Java

题目

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

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

顾客想进银行,用 In 表示,其中是顾客编号,为不大于100000的正整数;
叫号,用Calling表示。
最后一行是一个#符号,表示输入结束。

注意:

题目输入保证每个顾客的编号是独一无二的,即:不会出现想进银行的顾客与已经在等候区的顾客编号相同的情况。
保证后一个事件一定在前一个事件完成之后才发生,即:不需要考虑事件之间的“同步”问题。
输出格式:
对于输入的每个事件,按同样顺序在一行内输出事件的结果,格式分别是:

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

代码

public static void main(String[] args) throws IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(in.readLine());
    Queue<String> q = new LinkedList<>();
    String id;
    String[] op = in.readLine().split("\\s+");
    while(!op[0].equals("#"))
    {
        if(op[0].equals("In"))
        {
            id=op[1];
            if(q.size()==n)
            {
                System.out.println(id+" rejected.");
            }
            else
            {
                q.offer(id);
                System.out.println(id+" joined. Total:"+q.size());
            }
        }
        else
        {
            if(q.isEmpty())
            {
                System.out.println("No one");
            }
            else
            {
                id=q.poll();
                System.out.println(id+" called. Total:"+q.size());
            }
        }
        op=in.readLine().split("\\s+");
    }
    in.close();
}

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用程序简单模拟一个队列多窗口的排队模式: 设某银行有一个固定能容纳N个顾客的等候区,顾客想进银行,若等候区有空则可进,否则被拒绝进入。每当银行柜员叫号时,等候区中最先进入的顾客离开等候区前往柜台办理业务,若叫号时等候区无人,则此次叫号作废。 1.输入格式 第一行输入一个不大于20的正整数N,表示银行等候区能容纳的人数,接下来用若干行表示依时间顺序先后发生的“顾客想进银行”或“叫号”事件,格式分别是:  顾客想进银行,用 In <id> 表示,其中<id>是顾客编号,为不大于100000的正整数;  叫号,用Calling表示。 最后一行是一个#符号,表示输入结束。 注意:  题目输入保证每个顾客的编号是独一无二的,即:不会出现想进银行的顾客与已经在等候区的顾客编号相同的情况。  保证后一个事件一定在前一个事件完成之后才发生,即:不需要考虑事件之间的“同步”问题。 2.输出格式 对于输入的每个事件,按同样顺序在一行内输出事件的结果,格式分别是:  顾客想进银行,若顾客进入,则输出 <id> joined. Total:<t> 其中<id>是该顾客的编号,<t>是顾客进入后,等候区的人数  顾客想进银行,若因等候区满而被拒绝,则输出<id> rejected. 其中<id>是该顾客的编号  叫号,若有顾客前往柜台,则输出 <id> called. Total:<t> 其中<id>是该顾客的编号,<t>是顾客去柜台后,等候区的人数  叫号,等候区无人,则输出 No one! 这个是大学初学数据结构所做的一次作业任务,里面还有非常多可以优化的地方。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值