栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

如何实现银行家算法(java)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何实现银行家算法(java)

测试用例:
实现代码:

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();
    }
}

创作不易,点个大拇指吧!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/964272.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号