操作系统-第五章-LRU最近最少使用算法模拟-输出栈的变化序列(使用C++和vector实现)

发布时间:2024年01月16日

温馨提示:下面代码我使用的是含有c++的标准模板库(STL)vector的知识,还有文件读取的知识,如果没有学习过相关知识的同学,请先移步搜索相关视频或者帖子学习一下,我知道你的破学校或许不会教这些标准模板库的东西,但是你必须得学会,因为这才是C++的重中之重的知识。

【实验目的】

用高级语言模拟页面置换算法LRU,加深对LRU算法的认识。要求输出栈的变化序列。

【实验原理】

其基本原理为:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间 不被访问,再最近未来是不大可能被访问的。

?

此处使用计算机操作系统(第四版)汤小丹 梁红兵 哲凤屏 汤子瀛 编著第五章5.3节参考数据,结果一样

在项目目录下应该先有存好数据的input.txt文件

测试数据通过input.txt输入

4 7 0 7 1 0 1 2 1 2 6 2 4 1 3 0 1 2

代码逻辑:

代码中的N代表你要测试的物理块大小

创建栈调度算法中首先需要依次遍历页面号序列,通过search函数找到栈中是否存在这个页面号序列,

如果找不到,只有两种情况,要么栈没有满,要么栈已经满了,如果栈没有满,就把新的页面号序列压入栈中,如果栈已经满了,需要把栈底的数据清除,然后把新的页面号序列压入栈中

如果找到了,就把该页面号序列移到栈顶,把之后的序列往底部都移一位

代码如下:

#include< iostream>
#include<fstream>
#include<vector>
#include<string>
#define N  5//物理块大小
using namespace std;

ifstream ifs;
vector<int> iNum;
vector<int> stack;
vector<string> str;

void initialOutputStr()
{
	for (int i = 0; i < N; i++)
	{
		string a = "                                                            ";//最大支持30个页面号序列显示,若要添加请按空格填充
		str.push_back(a);
	}

}
//读取文件input.txt的数值
void read()
{
	int num;
	while (ifs >> num)
	{
		iNum.push_back(num);
	}
}
//遍历打印数组的数字
void print(vector<int> a)
{
	for (int num : a)
	{
		cout << num << " ";
	}
	cout << endl;
}
//寻找当前栈中是否有目标‘页’,有就返回下标,没有返回-1
int search(int num)
{
	for (unsigned j = 0; j < stack.size(); j++)
	{
		if (num == stack[j])
			return  j;
	}
	return -1;

}
//最终横向输出的函数
void finalOutput()
{
	for (int num : iNum)
	{
		cout << num << " ";

	}
	cout << endl;
	cout << endl;
	for (int t = N-1; t >= 0; t--)//从高到低,为方便记录字符,我在function函数是从低到高记录每次栈变化后的数字,故这里输出是从低到高输出
	{
		cout << str[t] << endl;
	}


}

//LRU调换主要功能函数
void function()
{
	for (unsigned k = 0; k < iNum.size(); k++)
	{
		int index = search(iNum[k]);
		
		if (index >= 0)//找到了
		{
			int temp = stack[index];

			for (unsigned m = index + 1; m <= stack.size() - 1; m++)
			{
				stack[m - 1] = stack[m];
			}
			*(stack.rbegin()) = temp;//把数组末尾的数字换成找到的目标‘页’

		}
		else//找不到
		{
			if (stack.size() < N)//栈未满
			{
				stack.push_back(iNum[k]);

			}
			else//栈已经满了
			{
				stack.erase(stack.begin());
				stack.push_back(iNum[k]);
			}

		}
		//cout << iNum[k] << "   :  ";//注释的这两行是横向输出
		//print(stack);
		for (unsigned q = 0; q < stack.size(); q++)
		{
			str[q][k * 2] = stack[q]+ '0';//k×2是为了字符串奇数位留出空格方便观看
		}
	}
}


int main()
{
	ifs.open("input.txt", ios::in);
	if (!ifs.is_open())
	{
		cout << "文件打开失败" << endl;
		return 0;
	}
	read();
	//print(iNum);
	initialOutputStr();
	function();
	finalOutput();
	return 0;
}

文章来源:https://blog.csdn.net/qq_59779173/article/details/135541605
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。