银行家算法
代码注释 之后再详细给出
#include<iostream>
#include<vector>
#include<string>
#include<iterator>
using namespace std;
class Process{
string name;
vector<int> Allocation;
vector<int> Max;
vector<int> Need;
public:
/*
Process()
{
A = B = C = D =0;
}
*/
Process(vector<int> A1,vector<int> M1,vector<int> N1,string sname):Allocation(A1),Max(M1),Need(N1),name(sname){}
//void operator=(Person& p1){A = p1.A, B = p1.B, C = p1.C, D = p1.D;}
//void setA(int xA){A = xA;}
// void setB(int xB){B = xB;}
//void setC(int xC){C = xC;}
void setA(int point,int s)
{
Allocation[point]+=s;
}
//void setM(int point,int s)
//{
// Max[point]+=s;
//}
void setN(int point,int s)
{
Need[point]-=s;
}
int getA(){return A;}
//int getB(){return B;}
//int getC(){return C;}
//int getD(){return D;}
vector<int> getA(){return Allocation;}
vector<int> getM(){return Max;}
vector<int> getN(){return Need;}
string getName(){return name;}
};
class Banker_Question{
vector<Process> v;
vector<string> pri_seq;
vector<int> available;
public:
Banker_Question(vector<Process> tv,vector<string> tpri_seq,vector<int> tavailable):v(tv),pri_seq(tpri_seq),available(tavailable){}
vector<Process>::iterator getIte(vector<Process>& pw,int position)
{
vector<Process>::iterator ite = pw.begin();
for(int i = 0; i < position ; i++)
ite++;
return ite;
}
bool Banker_Algorithm(vector<int> request,int P_position)
{
Process& Ppro = v[P_position];
vector<int> Ppro_Need = Ppro.getN();
for(int i = 0;i < 4;i++)
{
if(request[i]>available[i]||request[i]>Ppro_Need[i])
return false;
}
//while(v.size()!=0){
//int flag = false;
vector<int> available_test = available;
for(int i = 0;i < 4;i++)
{
Ppro.setA(i,request[i]);
//cout<<Ppro.getN()[i]-request[i]<<" ";
Ppro.setN(i,request[i]);
available_test[i]-=request[i];
//cout<<"ha"<<available_test[i];
//cout<<available[i]<<" ";
//cout<<Ppro.getN()[i]<<" ";
//if(Ppro.getN()[i]==0)
//available[i]+=Ppro.getA()[i];
//else
//available
}
//cout<<endl;
int flag = 0;
for(int i = 0;i < 4;i++)
{
if(Ppro.getN()[i]!=0)
{
flag = 1;
break;
}
}
vector<Process> vtt = v;
if(flag==0)
{
for(int i = 0;i < 4;i++)
available_test[i]+=Ppro.getA()[i];
pri_seq.push_back(Ppro.getName());
vtt.erase(getIte(vtt,P_position));
}
//cout<<Ppro.getA().size()<<endl;
//copy(Ppro.getA().begin(),Ppro.getA().end(),ostream_iterator<int>(cout," "));
//cout<<endl;
//vector<Process> vtt = v;
//pri_seq.push_back(Ppro.getName());
//vtt.erase(getIte(vtt,P_position));
if(Banker_Serach(vtt,pri_seq,available_test))
{
v = vtt;
available = available_test;
return true;
}
else
{
for(int i = 0;i < 4;i++)
{
Ppro.setA(i,-request[i]);
Ppro.setN(i,-Ppro.getN()[i]+request[i]);
//available[i]-=request[i];
}
return false;
}
}
bool Banker_Serach(vector<Process> vP_test,vector<string> vI_test,vector<int> vA_test)
{
//copy(vI_test.begin(),vI_test.end(),ostream_iterator<string>(cout," "));
//cout<<endl;
//copy(vA_test.begin(),vA_test.end(),ostream_iterator<int>(cout," "));
//cout<<"haha"<<endl;
if(vP_test.size()==0)
{
//copy(vI_test.begin(),vI_test.end(),ostream_iterator<string>(cout," "));
// cout<<endl;
pri_seq = vI_test;
//copy(pri_seq.begin(),pri_seq.end(),ostream_iterator<string>(cout," "));
return true;
}
for(int i = 0;i < vP_test.size();i++)
{
//cout<<"haha"<<endl;
Process p_test = vP_test[i];
int flag = 0;
for(int j = 0; j < 4 ; j++)
{
if(p_test.getN()[j]>vA_test[j])
{
//cout<<i<<" "<<j<<endl;
flag = 1;
break;
}
}
if(flag==0)
{
//cout<<i<<endl;
vector<Process> v2 = vP_test ;
vector<string> v3 = vI_test;
vector<int> v4 = vA_test;
for(int k = 0; k < 4 ; k++)
{
v4[k]+=v2[i].getA()[k];
}
v3.push_back(v2[i].getName());
v2.erase(getIte(v2,i));
if(Banker_Serach(v2,v3,v4));
return true;
}
}
return false;
}
vector<string> getNseq()
{
return pri_seq;
}
void clearSeq()
{
pri_seq.clear();
}
vector<int> getAva()
{
return available;
}
};
int main()
{
int n;
cout<<"有多少个进程"<<endl;
cin>>n;
vector<Process> v;
for(int i = 0;i < n;i++)
{
cout<<"请输入第"<<i<<"个进程所需要的资源"<<endl;
vector<int> tA(4,0);
cin>>tA[0]>>tA[1]>>tA[2]>>tA[3];
//Person tp;
vector<int> tM(4,0);
cin>>tM[0]>>tM[1]>>tM[2]>>tM[3];
vector<int> tN(4,0);
for(int i = 0;i < 4 ;i++)
tN[i]=tM[i]-tA[i];
string name;
cin>>name;
//cin>>tp.set
Process tP(tA,tM,tN,name);
v.push_back(tP);
}
vector<int> va;
cout<<"请输入系统当前可用各种资源数量"<<endl;
for(int i = 0 ;i < 4 ;i++)
{
int x;
cin>>x;
va.push_back(x);
}
vector<string> v3;
Banker_Question bq(v,v3,va);
vector<int> vneed(4,0);
char q;
cout<<"进行分配请按Y(包括只检测当前系统的安全性)"<<endl;
while(cin>>q&&q!='Q')
{
int position;
cout<<"你需要给哪个进程分配资源(若只检测请输入0)"<<endl;
cin>>position;
cout<<"请输入请求资源列表(若只检测请全部输入0)"<<endl;
for(int i = 0 ;i < 4;i++)
{
cin>>vneed[i];
}
if(bq.Banker_Algorithm(vneed,position))
{
cout<<"可以分配"<<endl;
//cout<<*bq.getNseq().begin()<<endl;
vector<string> vv = bq.getNseq();
//copy(vv.begin(),vv.end(),ostream_iterator<string>(cout," "));
for(int i = 0;i < vv.size();i++)
cout<<vv[i]<<" ";
cout<<endl;
// vector<int> vv1 = bq.getAva();
// for(int i = 0;i < vv1.size();i++)
// cout<<vv1[i]<<" ";
//copy(bq.getNseq().begin(),bq.getNseq().end(),ostream_iterator<string>(cout," "));
}
else
{
// vector<int> vv1 = bq.getAva();
// vector<string> vv = bq.getNseq();
//for(int i = 0;i < vv1.size();i++)
// cout<<vv1[i]<<" ";
cout<<"未分配成功"<<endl;
}
bq.clearSeq();
cout<<"如果想继续分配请按Y否则请按Q"<<endl;
}
//for(int i = 0)
return 0;
}