【C++队列实现LRU算法】

概要:本期主要讲解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;
        }
    }

}

猜你喜欢

转载自blog.csdn.net/wddkxg/article/details/129316998
今日推荐