#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int src[20] = { 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1 };
char status[20];
int stay;
int showArray[7][20];
void init()
{
for (int m = 0;m < 20;m++)
{
status[m] = 'N';
}
for (int i = 0;i < 7;i++)
{
for (int j = 0;j < 20;j++)
{
showArray[i][j] = -1;
}
}
}
void FIFO_find(int column, int* index,int stay)
{
for (int i = 0;i < stay;i++)
{
showArray[i][column + 1] = showArray[i][column];
}
for (int i = 0;i < stay;i++)
{
//showArray[i][column + 1] = showArray[i][column];
if (showArray[i][column] == src[column + 1])//finded
{
status[column + 1] = 'Y';
break;
}
}
if(stay==1)
{
if (status[column + 1] == 'N')//not find
{
showArray[0][column+1] = src[column + 1];
}
}
else
{
if (status[column + 1] == 'N')//not find
{
showArray[*index][column + 1] = src[column + 1];
*index = (*index)++;
if (*index >= stay) *index = 0;
}
}
}
int LRU_find_index(int column, int stay)
{
int *time = new int[stay];
for (int i = 0;i < stay;i++)
{
time[i] = -1;
}
for (int j = 0;j < stay;j++)
{
for (int i = 0;i <=column;i++)
{
if (showArray[j][column] == src[i])
time[j] = i;
}
}
int min = time[0];
int num = 0;
for (int i = 0;i < stay;i++)
{
if (min >=time[i])
{
min = time[i];
num = i;
}
}
int index=num;
if (min == -1 ) index = column+1;
return index;
}
void LRU_find(int column, int stay)
{
for (int i = 0;i < stay;i++)
{
showArray[i][column + 1] = showArray[i][column];
}
for (int i = 0;i < stay;i++)
{
if (showArray[i][column] == src[column + 1])//finded
{
status[column + 1] = 'Y';
break;
}
}
if (status[column + 1] == 'N')//not find
{
int index = LRU_find_index(column, stay);
showArray[index][column + 1] = src[column + 1];
}
}
int OPT_find_index(int column, int stay)
{
int* time = new int[stay];
for (int i = 0;i < stay;i++)
{
time[i] = 21;
}
for (int j = 0;j < stay;j++)
{
for (int i =19;i >=column+2;i--)
{
if (showArray[j][column] == src[i])
time[j] = i;
}
}
int max = time[0];
int num = 0;
for (int i = 0;i < stay;i++)
{
if (max <= time[i])
{
max = time[i];
num = i;
}
}
int index = num;
for (int i = 0;i < stay;i++)
{
if (showArray[i][column] == -1)
{
index = i;
break;
}
}
return index;
}
void OPT_find(int column, int stay)
{
for (int i = 0;i < stay;i++)
{
showArray[i][column + 1] = showArray[i][column];
}
for (int i = 0;i < stay;i++)
{
if (showArray[i][column] == src[column + 1])//finded
{
status[column + 1] = 'Y';
break;
}
}
if (status[column + 1] == 'N')//not find
{
int index = OPT_find_index(column, stay);
showArray[index][column + 1] = src[column + 1];
}
}
void dis(int stay)
{
for (int i = 0;i < 20;i++)
{
cout << src[i] << " ";
}
cout << endl;
cout << "---------------------------------------" << endl;
for (int row = 0;row < stay;row++)
{
for (int col = 0;col < 20;col++)
{
if (showArray[row][col] != -1)
cout << showArray[row][col] << " ";
else
{
cout << " ";
}
}
cout << endl;
}
cout << "---------------------------------------" << endl;
int miss=0;
for (int i = 0;i < 20;i++)
{
if (status[i] == 'N') miss++;
cout << status[i] << " ";
}
cout << endl;
cout << "The number of missing pages is :" << miss << endl;
cout << "The rate of missing pages is :" << double(miss) / 0.2 <<"%"<< endl;
cout << "=======================================" << endl;
cout << "=======================================" << endl;
}
void FIFO(int stay)
{
init();
cout << " **********FIFO********** " << endl;
cout << "---------------------------------------" << endl;
showArray[0][0] = src[0];
int index = 1;
for (int i = 1;i < 20;i++)
{
FIFO_find(i - 1, &index,stay);
}
//dis();
}
void LRU(int stay)
{
init();
cout << " **********LRU********** " << endl;
cout << "---------------------------------------" << endl;
showArray[0][0] = src[0];
int index;
for (int i = 1;i < 20;i++)
{
LRU_find(i - 1, stay);
}
}
void OPT(int stay)
{
init();
cout << " **********OPT********** " << endl;
cout << "---------------------------------------" << endl;
showArray[0][0] = src[0];
int index;
for (int i = 1;i < 20;i++)
{
OPT_find(i - 1, stay);
}
}
int main()
{
for (int i = 1;i <= 7;i++)
{
cout << " **********OPT********** " << endl;
stay = i;
FIFO(stay);
dis(stay);
LRU(stay);
dis(stay);
OPT(stay);
dis(stay);
cout << " ***********駐留集爲"<< to_string(i) << "********* " << endl;
}
//cout << showArray[1][1] << endl;
}