概要:本期主要讲解C++队列实现最近最久未使用(Least Recently Used)算法。
一、最近最久未使用算法
最近最少使用算法是一种淘汰算法,常用于虚拟内存的页面置换、缓冲队列信息处理等场景。
它的核心思想就是,淘汰最近最久没有使用的资源。
二、算法思想
算法思想如下图所示:
三、代码实现
下面展示一些 代码片
。
#ifndef LRU_H
#define LRU_H
#include <QObject>
class LRU : QObject
{
Q_OBJECT
typedef struct Node
{
QString data;
Node* next;
Node* pre;
Node()
{
data = "";
next = nullptr;
pre = next;
}
}QUEUE;
public:
LRU();
//队列实现LRU算法
void LRUReplacementAlgorithm();
private:
Node *head;//记录头节点
Node *tail;//记录队尾节点
int mLength;//记录队列长度
};
#endif // LRU_H
#include "lru.h"
#define MAX_SIZE 5
LRU::LRU()
{
head->data = "";//初始化头节点
head->next = nullptr;
head->pre = nullptr;
tail = head;
mLength = 0;
}
void LRU::LRUReplacementAlgorithm()
{
QStringList _strList;//初始化输入的数据
_strList << "1"<<"ss"<<"56"<<"5"<<"tt"<<"uu"<<"1"<<"88"<<"9"<<"1";
for(int i = 0;i < _strList.length();i ++)
{
if( mLength < MAX_SIZE)//维护队列长度,不超过
{
if(head->next == nullptr)//头插法建表
{
Node *newNode = new Node;//创建新节点
newNode->data =_strList.at(i);//当前节点赋值,当前节点为队首元素
newNode->pre = head;
newNode->next = nullptr;
head->next = newNode;
tail = newNode;//更新尾节点位置
mLength ++;//更新链表长度
}
else
{
//检索最近是否输入过当前数据
bool _isFind = false;
//遍历单链表查询节点
Node *traveNode = head->next;
while(traveNode)
{
if(traveNode->data == _strList.at(i))
{
_isFind = true;//存在相同数据,返回当前节点
break;
}
if(traveNode->next == nullptr)
{
break;
}
traveNode = traveNode->next;
}
if(!_isFind)
{
Node *newNode = new Node;//创建新节点
newNode->data =_strList.at(i);//当前节点赋值
newNode->next = head->next;
head->next->pre = newNode;
newNode->pre = head;
head->next = newNode;
mLength ++;//更新队列长度
}
else
{
//将该节点移动到队首
//1.将该节点从队列中删除
traveNode->next->pre = traveNode->pre;
traveNode->pre->next = traveNode->next;
mLength --;
//2.将该节点添加到队首
traveNode->next = head->next;
head->next->pre = traveNode;
traveNode->pre = head;
head->next = traveNode;
mLength ++;
}
}
}
else
{
tail = tail->pre;//维护队尾节点
tail->next = nullptr;
}
}
}