测试用例:
实现代码:
import java.util.Scanner;
public class Banker {
int Max[][]= new int[10][10];//最大需求矩阵
int Allocation[][]=new int[10][10];//系统已分配矩阵
int Need[][]=new int[10][10];//还需要资源矩阵
int Available[]=new int[10];//可用资源矩阵
int Request[]=new int[10];//请求资源向量
int Work[]=new int[10];//存放系统可提供资源量
int Finish[]=new int[10]; //标记系统是否有足够的资源分配给各个进程
int Security[]=new int[10];//存放安全序列
Scanner sc=new Scanner(System.in);
//初始化各类数据
public void init()
{
int i,j,m,n;
System.out.println("输入进程数目:");
n = sc.nextInt();
System.out.println("输入资源的种类:");
m = sc.nextInt();
System.out.println("输入每个进程最多所需的各类资源数Max,按照"+n+"x"+m+"矩阵输入");
for(i = 1; i < n+1; i++){
for(j = 1; j < m+1; j++){
Max[i][j] = sc.nextInt(); //Max[i][j]表示第i个进程的第j个资源的最大值是什么
}
}
System.out.println("输入每个进程最多所需的各类资源数Allocation,按照"+n+"x"+m+"矩阵输入");
for(i = 1; i < n+1; i++){
for(j = 1; j < m+1; j++){
Allocation[i][j] = sc.nextInt(); //输入Allocation
}
}
for(i = 1; i < n+1; i++){
for(j = 1; j < m+1; j++){
Need[i][j] = Max[i][j] - Allocation[i][j]; //计算Need
}
}
System.out.println("请输入各个资源现有的数目Available:");
for(i = 1; i < m+1; i++){
Available[i] = sc.nextInt(); //获取Available
}
safe(n,m);
bank(n,m);
}
//尝试分配资源
public int test(int i,int N)
{
for(int j=1;j<=N;j++)
{
Available[j]=Available[j]-Request[j];
Allocation[i][j]=Allocation[i][j]+Request[j];
Need[i][j]=Need[i][j]-Request[j];
}
return 1;
}
//分配失败,恢复系统状态
public int retest(int i,int N)
{
for(int j=1;j<=N;j++)
{
Available[j]=Available[j]+Request[j];
Allocation[i][j]=Allocation[i][j]-Request[j];
Need[i][j]=Need[i][j]+Request[j];
}
return 1;
}
//安全性算法
public int safe(int length,int Msum)
{
int apply,p=0,i;
boolean flag=false;
//定义work矩阵
for (int j = 1; j < Msum + 1; j++) {
Work[j] = Available[j];
}
//初始化Finish数组
for (i = 1; i < length + 1; i++) {
Finish[i] = 0;
}
//求安全序列
for (i = 1; i <=length ; i++) {
apply=0;
for (int j = 1; j <=Msum; j++) {
if (Finish[i]==0&&Need[i][j]<=Work[j]){ //判断未分配和小于工作矩阵
apply++;
if (apply==Msum){
for (int k = 1; k <=Msum ; k++) {
Work[k]+=Allocation[i][k];
}
Finish[i]=1;
Security[p]=i;
p++;
i=0;
}
}
}
}
for(i=1;i
if(Finish[i]==0)
{
System.out.println("系统不安全!");
return 0;
}
}
//打印安全序列
System.out.println("系统是安全的");
System.out.println("系统安全序列是:");
for (int j = 0; j
System.out.print(Security[j]);
if (j!=length-1){
System.out.print("-->");
}
}
System.out.println();
return 1;
}
//银行家算法处理申请资源
public void bank(int length,int Msum)
{
System.out.println("输入要申请的资源的进程号:(第一个进程号为1,依此类推)");
int i=sc.nextInt();
System.out.println("输入进程所申请的各类资源数:");
for(int j=1;j
Request[j]=sc.nextInt();
}
if(test(i,Msum)==1){
if (safe(length,Msum)==1){
System.out.println("申请成功");
}
else{
retest(i,Msum);
System.out.println("申请失败,系统不安全");
//判断用户是否还需要申请
while(true){
System.out.println("是否需要申请?(y/n)");
String s=sc.next();
if(s.equals("y")){
bank(length,Msum);
break;
}
else if(s.equals("n")){
break;
}
else{
System.out.println("输入错误,请重新输入");
}
}
}
}
}
//主函数
public static void main(String[] args) {
Banker b = new Banker();
//初始化系统资源
b.init();
}
}
创作不易,点个大拇指吧!



