100行C++代码实现银行家算法

1、实现流程图
在这里插入图片描述2、代码实现

#include <iostream>
using namespace std;
int main()
{
	int r, p;//资源总数、进程数
	bool is_security_all=true;//判断是否存在安全进程
	bool is_security_process = true;//判断当前进程是否安全
	bool is_test;//判断当前进程是否已经被检测
	int process_test=0;//已经被检测的进程数
	cout << "请输入资源总数、进程数:" << endl;
	cin >> r >> p;
    /*定义一个一维数组用来存放当前可用资源数*/
	int* available = new int[r];
    /*定义一个二维数组用来存放每个进程所需得最大资源数*/
	int** max = new int* [p];
	for (int i = 0; i < p; i++)
		max[i]= new int[r];
	/*定义一个二维数组用来存放每个进程已分配的资源数*/
	int** allocation = new int* [p];
	for (int i = 0; i < p; i++)
		allocation[i] = new int[r];
	/*定义一个二维数组用来存放每个进程需求的资源数*/
	int** need = new int* [p];
	for (int i = 0; i < p; i++)
		need[i] = new int[r];
	/*定义一个一维数组用来存放当前安全序列中各种资源的个数*/
	int* work = new int[r];
	/*定义一个一维数组来记录安全序列*/
	int* path = new int[p];
	cout << "请输入已分配给每个进程的各种资源数" << endl;;
	for (int i = 0; i < p; i++)
		for (int j = 0; j < r; j++)
			cin >> allocation[i][j];
	cout << "请输入每个进程所需的最大各种资源数" << endl;;
	for (int i = 0; i < p; i++)
		for (int j = 0; j < r; j++)
			cin >> max[i][j];
	cout << "请输入当前系统剩余的各种资源数" << endl;
	for (int i = 0; i < r; i++)
			cin >> available[i];
	/*每个进程需求的资源数*/
	for (int i = 0; i < p; i++)
		for (int j = 0; j < r; j++)
			need[i][j] = max[i][j] - allocation[i][j];
	/*检测是否存在安全序列*/
	for (int i = 0; i < r; i++)//当前安全序列中各种资源的总数
		work[i] = available[i];
	int iterator;//每次检测一个安全进程的迭代变量
	while (process_test < p&&is_security_all==true)//序列安全且所有进程还未检测完毕
	{
		for ( iterator = 0; iterator < p; iterator++)//查找哪一个进程还未被检测,且每次检测一个安全进程
		{
			is_security_process = true;//假设当前进程是安全的
			is_test = false;//假设当前进程还未被检测
			for (int j = 0; j < process_test; j++)//确认是否被检测过了
				if (path[j] == iterator)
				{
					is_test = true;
					break;
				}
			if (is_test == false)//如果未被检测过
			{
				
				for (int z = 0; z < r; z++)//检测当前进程是否安全
					if (need[iterator][z] > work[z])
					{
						is_security_process = false;
						break;
					}
				if (is_security_process == true)//如果当前进程安全,将其加入安全序列中
				{
					path[process_test] = iterator;
					process_test++;
					for (int y = 0; y < r; y++)//更新当前序列各种资源的work值
						work[y] += allocation[iterator][y];
					break;//中断此次安全进程检测
				}
			}
		}
		if (iterator == p&&process_test<p)//如果序列检测完毕或不存在安全进程,更新is_security_all的值
			is_security_all = false;
	}
	if (is_security_all)//存在安全序列
	{
		cout << "存在安全序列:";
		for (int i = 0; i < p; i++)
			cout << path[i] + 1 <<" ";
		cout << endl;
	}
	else
		cout << "不存在安全序列" << endl;
}

3、程序运行结果
存在安全序列:
在这里插入图片描述
不存在安全序列:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值