1. 设计思路
使用c++栈函数
最近使用的放在栈顶,最久未使用的处于栈底。
- 判断栈内是否为空(判断当前页框中有没有页面)
- 为空->直接入栈
- 不为空->通过辅助栈对主栈内容进行遍历
- 有相同的,将原栈中的页面删除,将新进的页面放在栈顶,从而确保最近使用过的页面处于栈顶
- 没有相同的,将栈底元素删除,将新进页面放在栈顶,从而将最久未使用的删除并确保最近使用过的页面处于栈顶
2. 代码
/*最近最少使用LRU
* 将最近使用的放在栈顶
*/
#include <iostream>
#include<stack>
#include<vector>
using namespace std;
int main()
{
int physical_block_num; // 物理块数量
int page_num; //页面数
int page_no; //页面号
stack<int, vector<int>>s1; //主栈
stack<int, vector<int>>s2; //辅助栈
cout << "请输入物理块数量:";
cin >> physical_block_num;
cout << "请输入页面数量:";
cin >> page_num;
for (int i = 0; i < page_num; i++)
{
int state = 0; //标记栈中有没有相同的
cin >> page_no;
if (s1.empty()) //为空直接入栈
{
s1.push(page_no);
cout << "*";
}
else {
while (!s1.empty())
{
if (page_no == s1.top()) { //有相同的
cout << "-";
s1.pop(); //把相同的丢掉
while (!s2.empty())
{
s1.push(s2.top()); //把s2中的放回来
s2.pop();
}
s1.push(page_no); //把最新加入的放到栈顶,保证最新使用过的在上面
state = 1;
break;
}
else {
s2.push(s1.top()); //把s1中的元素放入s2中
s1.pop(); //把换到s2中的,删除
}
}
if (state == 0) { //如果没有相同的,s1中的元素会被全部换到s2中
if (s2.size() == physical_block_num) //判断需不需要把原来栈中的内容删除
{
s2.pop(); //先把s2中的第一个删除,第一个是最久未使用的
while (!s2.empty()) {
s1.push(s2.top()); //把s2中的其他元素放入s1中
s2.pop(); //把s2中放入s1中的元素删除
}
s1.push(page_no); //把最新添加进来的放在最上面
cout << "*";
}
else {
while (!s2.empty()) {
s1.push(s2.top()); //把s2中的其他元素放入s1中
s2.pop(); //把s2中放入s1中的元素删除
}
s1.push(page_no); //把最新添加进来的放在最上面
cout << "*";
}
}
}
while (!s1.empty())
{
cout << s1.top();
s2.push(s1.top());
s1.pop();
}
while (!s2.empty())
{
s1.push(s2.top());
s2.pop();
}
cout << endl;
}
}
/*test data
3
20
9 2 3 4 2 5 2 6 4 5 2 5 4 3 4 2 3 9 2 3
*/
3. 测试数据
3
20
9 2 3 4 2 5 2 6 4 5 2 5 4 3 4 2 3 9 2 3