以下算法只是演示过程,判断是否存在安全序列,如果存在给出一个。
其实个人感觉用C++应该会更容易实现。
对二维数组改日一定要多下功夫研究下啊!!!!!!!!!!!!!!!
#include<stdio.h>
#define M 4//进程数目P1,P2,P3......
#define N 3//资源数目A,B,C......
#define Stacksize M*N*M//堆栈的大小此处数组的第一个数是堆栈指针,只是当前的位置 。指向1时候表是1有数字,而2没有
void Matrix_Initialization(int array1[][N]);
void Matrix_Subtraction(int array1[][N],int array2[][N],int array3[][N] );
int Vector_compare(int*array1,int*array2,int n);
int Search_process(int need[][N],int *available,int*flag,int*stack);
int pop(int *stack);
void push(int *stack,int i);
int Check_safe(int need[][N],int*available,int*stack,int*sequence);
void Vector_subtration(int *array1,int*array2,int n);
void Vector_add(int *array1,int*array2,int n);
int main()
{
int Max[M][N]={3,2,2,6,1,3,3,1,4,4,2,2};
int Allocation[M][N]={1,0,0,5,1,1,2,1,1,0,0,2};
int Need[M][N]={0};
int Available[N]={1,1,2};
int Sequence[M]={-1,-1,-1,-1};
int Stack[Stacksize]={-1};
Stack[0]=0;
/*如果使用一下则进行键盘输入初始化地Max和Allocation 和avaliable
printf("please initialize the max_Matrix \n");
Matrix_Initialization(Max);
printf("please initialize the Allocation_Matrix \n");
Matrix_Initialization(Allocation);
printf("please initialize the avaliable matrix \n");
for(int i=0;i<N;i++)
scanf("%d",&Available[i]);
*/
printf("\n ^_^welcome to wuhan university^_^\n\n");
Matrix_Subtraction(Need,Max,Allocation);
printf("\nMax矩阵:\n");
for(int i=0;i<M;i++){
printf("\n");
for(int j=0;j<N;j++)
printf(" %d ",Max[i][j]);}
printf("\nAllocation矩阵:");
for(int i=0;i<M;i++){
printf("\n");
for(int j=0;j<N;j++)
printf(" %d ",Allocation[i][j]);}
printf("\nNeed矩阵:");
for(int i=0;i<M;i++){
printf("\n");
for(int j=0;j<N;j++)
printf(" %d ",Need[i][j]);}
if(Check_safe(Need,Available,Stack,Sequence)==0)
printf("\n\nIt's not safe!!!!!!!\n");
else{
printf("\nthe safe sequence maybe :");
for(int j=0;j<M;j++)
printf("P%d ",Sequence[j]); }
printf("\n ^_^welcome to wuhan university^_^\n\n");
getchar();
getchar();
getchar();
return 0;
}
//===========Matrix_Subtraction=====================//
/*
此函数为矩阵相减,用array2减去array3保存在array1中;
其中m表示矩阵的行数,n表示矩阵的列数。
*/
void Matrix_Subtraction(int array1[][N],int array2[][N],int array3[][N] )
{
for(int i=0;i<M;i++)
for(int j=0;j<N;j++)
array1[i][j]=array2[i][j]-array3[i][j];
}
//===========Vector_add===========================//
/*
此函数的作用是向量相加
array1加上array2并且保存在array1中
*/
void Vector_add(int *array1,int*array2,int n)
{
for(int i=0;i<n;i++)
array1[i]+=array2[i];
}
//===========Vector_subtration===========================//
/*
此函数的作用是向量相加
array1加上array2并且保存在array1中
*/
void Vector_subtration(int *array1,int*array2,int n)
{
for(int i=0;i<n;i++)
array1[i]-=array2[i];
}
//===========Matrix_Initialization=====================//
/*
此函数为矩阵的初始化,其中m表示行数,n表示列数
*/
void Matrix_Initialization(int array1[][N])
{
for(int i=0;i<M;i++){
printf("please input the P%d's source\n",i);
for(int j=0;j<N;j++){
printf("please input the number of P%d's source %c's\n ",i,j+65);
scanf("%d",&array1[i][j]);}}
}
//========Vector_compare===================//
/*
此函数为向量的比较当且仅当array1比array2中的每个元素都大的时候返回1
否则返回0
其中n为向量中元素的个数
*/
int Vector_compare(int*array1,int*array2,int n)
{
for(int i=0;i<n;i++)
if(array1[i]<array2[i])
return 0;
return 1;
}
//=======Search_process=====
/*
此函数是寻找满足条件的进程进栈
如果不存在一个进程满足条件;
则返回0
否则返回1
*/
int Search_process(int need[][N],int *available,int*flag,int*stack)
{
int test=0 ;
for(int i=0;i<M;i++){
if(flag[i]==0){
if(Vector_compare(available,need[i],N)==1){
test=1;
push(stack,i); } }}
return test;
}
//=========Check_safe==========
/*
检查此分配时候是否安全
安全返回1否则返回0
*/
int Check_safe(int need[][N],int*available,int*stack,int*sequence)
{int temp;
int sflag=-1;
int flag[M]={0};
if(Search_process(need,available,flag,stack)==0)
return 0;
while(stack[0]!=0&&(sequence[M-1]==-1)){
temp=pop(stack);
flag[temp]=1;
sequence[++sflag]=temp;
if(sequence[M-1]!=-1)
return 1;
Vector_add(available,need[temp],N);
if(Search_process(need,available,flag,stack)==0){
flag[temp]=0;
Vector_subtration(available,need[temp],N);
sequence[sflag]=-1;
sflag--;
}//if
}//while
if(sequence[M-1]==-1)
return 0;
return 1;
}
void push(int *stack,int i)
{
stack[0]++;
stack[stack[0]]=i;
}
int pop(int *stack)
{
int temp=stack[stack[0]];
stack[0]--;
return(temp);
}
测试1:
测试2: