C++使用链表实现key-value存储,并且实现LRU策略

1单链表长度不超过LIMIT
2如果长度满,采用LRU(最旧记录丢弃)策略

set时往单链表的尾部插入数据,每次get时将get到的节点移动到链表尾部,因此链表尾部数据为最新数据,依次往前,链表头部为最旧数据。

代码如下

#include <string>
#include <iostream>
using namespace std;

struct ListNode
{
	string key;
	string value;
	ListNode* next;
	ListNode() : key(""), value(""), next(nullptr) {}
};

ListNode* kv= new ListNode();//定义整个链表头结点
ListNode* setpre = kv;//定义链表的尾部
int count = 0;//定义链表中已存储的数量
int LIMIT = 3;//链表的最大长度

string get(string key)//查询数据,并将查询到的数据移动到链表尾部
{
	ListNode* getpre = kv;
	ListNode* tmp = kv;
	while (getpre !=nullptr)
	{		
		if (getpre->key == key)
		{
			if (getpre == kv)
			{
				kv = kv->next;
			}
			else
			{
				tmp->next = tmp->next->next;
			}
			setpre->key = getpre->key;
			setpre->value = getpre->value;
			string value = getpre->value;
			setpre->next = new ListNode();
			setpre = setpre->next;
			
			delete getpre;//释放被移动节点的内存
			return value;
		}	
		tmp = getpre;
		getpre = getpre->next;

	}
	return "cant find this key";
}

int set(string key, string value)//插入新数据
{
	if (count >= LIMIT)
	{
		kv = kv->next;
		count --;
	}
	setpre->key = key;
	setpre->value = value;
	setpre->next = new ListNode();
	setpre = setpre->next;
	count ++;

	return 0;
}

int main()
{
	string action;
	string key, value;
	cout << "please enter set or get" << endl;
	while (cin >> action)
	{
		if (action == "set")
		{
			cout << "please enter key" << endl;
			cin >> key;
			cout << "please enter value" << endl;
			cin >> value;
			int result=set(key, value);
			if (result == 0)
				cout << "set success" << endl;
			cout << "please enter set or get" << endl;
		}
		if (action == "get")
		{
			cout << "please enter key" << endl;
			cin >> key;
			value = get(key);
			cout << "result:" << value << endl;
			cout << "please enter set or get" << endl;
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值