前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构--链表--LRU缓存

数据结构--链表--LRU缓存

作者头像
Michael阿明
发布2021-02-20 10:24:38
1560
发布2021-02-20 10:24:38
举报

LRU(Least Recently Used)缓存策略:

通俗的讲就是,最近使用的放在最前面,不经常使用的放后面,满了就删除

C++代码实现

代码语言:javascript
复制
//用单链表实现LRU策略   2019.3.17
#include <iostream>
#include <string>
using namespace std;
struct weburl
{
	string website;
	weburl *next;
	
};
class webList
{
	weburl *p_head;
	size_t cacheSize;
public:
    webList():p_head(new weburl),cacheSize(0)
    {
	p_head->next = NULL;    //犯错,开始没有写这句,导致后面有的地方非法访问
    }
    ~webList()
    {
        eraseAll();
        delete p_head;
    }
    void eraseAll()
    {
        weburl *tempNode = p_head->next, *del_Node = NULL;
        while(tempNode != NULL)
        {
            del_Node = tempNode;
            tempNode = tempNode->next;
            delete del_Node;
            cacheSize--;   
//          tempNode = tempNode->next;    //千万注意顺序,之前放这错了!!!
        }
    }
    weburl* get_head()
    {
	return p_head;
    }
    weburl* find(string &str)
    {
        weburl *tempNode = p_head;
	while(tempNode->next != NULL)
        {
	    if(tempNode->next->website == str)
	        return tempNode;    //返回的是找到的节点的上一个节点
	    else
                tempNode = tempNode->next;
        }
	return NULL;
    }
    size_t getCacheSize()
    {
	return cacheSize;
    }
    void incrCacheSize()
    {
	cacheSize++;
    }
    void decrCacheSize()
    {
	cacheSize--;
    }
    void push_front(weburl *p)
    {
        p->next = p_head->next;
        p_head->next = p;
        incrCacheSize();
    }
    void move_to_front(weburl *p)
    {
        p->next = p_head->next;
        p_head->next = p;
    }
    void pop_back()
    {
	weburl *p = p_head, *prev = NULL;
	while(p->next != NULL)
        {
	    prev = p;
	    p = p->next;
        }
	prev->next = NULL;
	delete p;
	decrCacheSize();
    }
    void printCacheList()
    {
	cout << "the recently visit website: " << endl;
	weburl *tempNode = p_head;
	size_t i = 0;
	while(tempNode->next != NULL)
        {
	    tempNode = tempNode->next;
	    cout << ++i << " " << tempNode->website << endl;
        }
    }
};
int main()
{
    char conti = 'y';
    size_t maxCacheSize = 5;
    string web;
    webList cacheList;
    while(conti == 'y' || conti == 'Y')
    {
        
        cout << "-------------------------------------------" << endl;
        cout << "please enter the weburl you want to visit: " << endl;
        cin >> web;
        weburl *tempNode = cacheList.find(web);
        weburl *head = cacheList.get_head();
        if (tempNode == NULL)    //没有找到,是新的访问记录
        {
            weburl *newWeb = new weburl;
            newWeb->website = web;
            newWeb->next = NULL;
            if (cacheList.getCacheSize() < maxCacheSize) //存储没满,直接加到队首
            {
                cacheList.push_front(newWeb);
            } 
            else    //存储满了,删除队尾,插入新的到队首
            {
                cacheList.pop_back();
                cacheList.push_front(newWeb);
            }
        } 
        else    //从已有的数据中找到了记录
        {
            if (tempNode == head)    ;   //记录在第一条,则无需操作
            else 
            {
                weburl *mvRecord = tempNode->next;
                tempNode->next = mvRecord->next;    //把该记录从链表中断开
                cacheList.move_to_front(mvRecord);  //把该记录移到队首
            }

        }
        cacheList.printCacheList();
        cout << "continue? y/n" << endl;
        cin >> conti;
        cin.get();
    }
    return 0;
}

Valgrind检查结果

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C++代码实现
  • Valgrind检查结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档