LRU队列实现的原理:命中的页面置换到队尾,未命中的从队尾进,队头出队。
C++实现代码:
#include <iostream>
#include <time.h>
using namespace std;
#define LENGTH 300 //页面访问序列长度
void initOrderArray(int*, int);
class ListNode
{
public:
ListNode(int, ListNode*);
ListNode* next;
int data;
};
ListNode* createList(); //初始化栈
ListNode* insertNode(ListNode*, int,int);
ListNode* change(ListNode*&, int);
bool isExist(ListNode*, int);
ListNode::ListNode(int a, ListNode* b) {
this->data = a;
this->next = b;
}
int main()
{
ListNode* headList = createList();
int num[LENGTH] = { 0 };
int hit_num = 0;
float p;
initOrderArray(num, LENGTH);
for (int i = 0; i < LENGTH; i++)
{
cout << num[i] << endl << endl;
if (isExist(headList, num[i]))
{
headList = change(headList, num[i]);
hit_num++;
}
else
headList = insertNode(headList, num[i],i);
cout << headList->data << endl;
cout << headList->next->data << endl;
cout << headList->next->next->data << endl;
cout << endl << endl;
}
p = hit_num / float(LENGTH);
cout << "命中率" << p << endl;
return 0;
}
ListNode* createList()
{
ListNode* n, * m, * p;
p = new ListNode(0, NULL);
m = new ListNode(0, p);
n = new ListNode(0, m);
return n;
}
ListNode* insertNode(ListNode* s, int n,int i)
{
ListNode* m;
if (i < 3)
{
m = new ListNode(n, s);
s->next->next = NULL;
return m;
}
else
s->next->next->data = n;
return s;
}
ListNode* change(ListNode* &s, int n)
{
ListNode* m, * p,* t;
m = s;
p = s;
while (m)
{
if (m->data == n)
{
if (m->data == s->data)
{
return m;
}
else
{
t = new ListNode(n, s);
p->next = m->next;
return t;
}
}
p = m;
m = p->next;
}
return m;
}
bool isExist(ListNode* s, int n)
{
ListNode* m,* p;
m = s;
p = s;
while (m)
{
if (m->data == n)
{
return true;
}
m = m->next;
}
return false;
}
void initOrderArray(int* a, int n)
{
srand((unsigned)time(NULL));
for (int i = 0; i < n; i++)
{
a[i] = rand() % 6 + 1;
}
}