队列仿真一个银行叫号系统

利用队列仿真一个银行叫号系统,定义开户、取款、存款、销户四种业务,每个业务时长不同,大家可以提前定义好(比如开户20分钟,取款15分钟,存款10分钟,销户25分钟),定义m个服务窗口,随机生成n个业务(放在队列中存储),编写程序仿真出这m个窗口具体办理的客户的顺序。

叫号系统的的输出类似这样:比如10个人,他们办理的业务类型是随机的,有3个服务窗口,输出的是:
客户1,1号窗口,
客户2,2号窗口,
客户3,3号窗口;
客户4,3号窗口;
…….

#include<iostream>
using namespace std;
typedef struct User
{
	int id;
	int val;
}User;
User stu[7] = { {1,1},{2,2},{3,3},{4,3},{5,1},{6,4},{7,3} };//客户数组
int timenum[5] = {0,20,15,10,25 };//操作时间数组,多设一个便于检索
int account[3] = { 0 };//三个窗口时间变化数组
//char string[4][12] = {"开户","取款","存款","销户"};
class Queue
{
public:
	int maxsize;
	int front;
	int rear;
	struct User* stx;
	Queue(int size)//初始化
	{
		maxsize = size;
		stx = new User[size];
		front = rear = 0;
	}
	~Queue()
	{
		delete[]stx;
	}
	bool EnQueue(User x)//入栈
	{
		if ((rear + 1) % maxsize == front)
		{
			cout << "栈满,溢出" << endl;
			return false;
		}
		stx[rear] = x;
		rear = (rear + 1) % maxsize;
		return true;
	}
	bool DeQueue(User &x)//出栈
	{
		if (front == rear)
		{
			cout << "队列为空" << endl;
			return false;
		}
		x = stx[front];
		front = (front + 1) % maxsize;
		return true;
	}
};

int main()
{
	Queue queue(8);
	for (int i = 0;i < 7;i++)//初始化
	{
		queue.EnQueue(stu[i]);
	}
	User w[3],cru;
	for (int i = 0;i < 3;i++)//初始化窗口
	{
		queue.DeQueue(cru);
		w[i] = cru;
		account[i] = timenum[w[i].val];
		cout << "客户" << w[i].id << "  窗口" << i+ 1 << endl;
	}
	while (queue.front != queue.rear)//循环
	{
		int j = 0;
		while (j< 3)
		{
			if (account[j] == 0)//如果有窗口结束,则换人
			{
				queue.DeQueue(cru);
				w[j] = cru;
				account[j] = timenum[w[j].val];
				cout << "客户" << w[j].id << "  窗口" << j + 1 << endl;//一旦交替,就输出
			}
			j++;
		}
		for (int i = 0;i < 3;i++)//表示时间的流逝
		{
			account[i]--;
		}
	}

	
	return 0;
}
	

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,这是您的第二个问题。下面是一个简单的多线程模拟银行叫号系统的示例代码: 首先,您需要创建一个Ticket类,用于表示每个顾客的票号和窗口号,如下所示: ```java public class Ticket { private int number; private int window; public Ticket(int number, int window) { this.number = number; this.window = window; } public int getNumber() { return number; } public int getWindow() { return window; } } ``` 然后,您可以创建一个银行类Bank,用于模拟叫号系统,如下所示: ```java import java.util.LinkedList; import java.util.Queue; public class Bank { private int windowCount; // 窗口数量 private Queue<Integer> ticketQueue; // 顾客票号队列 private Ticket[] windows; // 窗口顾客票号数组 public Bank(int windowCount) { this.windowCount = windowCount; ticketQueue = new LinkedList<Integer>(); windows = new Ticket[windowCount]; } public synchronized void takeTicket() { int ticketNumber = ticketQueue.size() + 1; ticketQueue.offer(ticketNumber); System.out.println("顾客" + ticketNumber + "取号成功,当前排队人数:" + ticketQueue.size()); notifyAll(); } public synchronized void callTicket(int windowNumber) { while (true) { if (ticketQueue.isEmpty()) { System.out.println("窗口" + windowNumber + "等待顾客中..."); try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } else { int ticketNumber = ticketQueue.poll(); Ticket ticket = new Ticket(ticketNumber, windowNumber); windows[windowNumber - 1] = ticket; System.out.println("窗口" + windowNumber + "叫到了顾客" + ticketNumber + ",请前往" + windowNumber + "号窗口办理业务"); notifyAll(); break; } } } public synchronized void finishTicket(int windowNumber) { Ticket ticket = windows[windowNumber - 1]; if (ticket != null) { System.out.println("窗口" + windowNumber + "完成了顾客" + ticket.getNumber() + "的业务"); windows[windowNumber - 1] = null; notifyAll(); } } } ``` Bank类的构造函数接收一个窗口数量,初始化一个顾客票号队列一个窗口顾客票号数组。takeTicket()方法用于顾客取号,它首先为当前顾客生成一个顾客票号,然后将其加入到队列中,并输出当前排队人数。callTicket()方法用于窗口叫号,它首先检查队列是否为空,如果为空,则窗口等待;否则,窗口叫到了下一个顾客,并将其从队列中弹出,并将其票号和窗口号存储到窗口顾客票号数组中,并输出调用信息。finishTicket()方法用于窗口完成业务,它首先检查窗口是否有顾客,如果没有,则等待;否则,窗口完成了当前顾客的业务,并将窗口顾客票号数组中的该位置清空,并输出调用信息。 最后,您可以创建一个模拟程序,用于创建多个顾客线程和多个窗口线程,来模拟银行叫号系统,如下所示: ```java public class BankSimulation { public static void main(String[] args) { Bank bank = new Bank(3); // 创建多个顾客线程 for (int i = 1; i <= 10; i++) { Thread thread = new Thread(new Runnable() { @Override public void run() { bank.takeTicket(); } }); thread.start(); } // 创建多个窗口线程 for (int i = 1; i <= 3; i++) { int windowNumber = i; Thread thread = new Thread(new Runnable() { @Override public void run() { while (true) { bank.callTicket(windowNumber); try { Thread.sleep(2000); // 模拟窗口处理业务的时间 } catch (InterruptedException e) { e.printStackTrace(); } bank.finishTicket(windowNumber); } } }); thread.start(); } } } ``` 上述代码将创建10个顾客线程和3个窗口线程,模拟银行叫号系统的运行过程。您可以根据自己的需要对其进行修改。希望能够帮到您,如果您有任何问题,请随时问我!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大肥羊学校懒羊羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值