LRU淘汰算法(c++数组模拟堆栈实现)


理论来源以及思路来源,请点击这里,这是链接

图片我是从文章链接网址抄的

虽然说是堆栈存储,但不是我们一般想的堆栈,有点像堆栈与队列的结合,他要求的是在栈顶插入,栈底或中间取出,因此我们用数组模拟。具体详情请看LRU原理
在这里插入图片描述

#include <iostream>

using namespace std;

//查找函数,判断元素val有没有在堆栈stack中
int Find( int *stack , int val , int usedSpace ){
    
    //usedSpace为堆栈已经使用的空间,因此循环从0到usedSpace-1
    for( int i = 0 ; i < usedSpace ; i++ ){
        if( val == stack[i] ){
            return i;
        }
    }

    return -1;  //没有找到即没有在堆栈中返回-1
}

int main()
{
    int stack[100]; //栈空间为100
    int visited[100]; //任务队列空间为100
    int usedSpace = 0;    //栈中已经使用空间
    int stackSpace = 0;   //分配的栈大小
    int n;  //队列元素个数
    cout << "请输入分配栈的大小:";
    cin >> stackSpace;

    cout << "\n\n请输入队列元素个数:";
    cin >> n;

    cout << "\n\n请以依次输入队列元素:\n";
    
    for( int i = 0 ; i < n ; i++ ){ //输入任务队列元素
        cin >> visited[i];
    }

    for( int i = 0 ; i < n ; i++ ){
        int index = Find( stack , visited[i] , usedSpace);  //判读元素visited[i]是否在堆栈中

        //元素没有在堆栈中
        if( index == -1 ){

            //栈中有剩余空间,直接将元素放在栈顶
            if( usedSpace < stackSpace ){
                stack[ usedSpace ] = visited[i];
                usedSpace++;
            }else{  //栈中没有剩余元素,需要将栈顶元素置换出来
                int j;
                
                for( j = 0 ; j < stackSpace - 1 ; j++ ){    //每个元素往前移动,覆盖栈底元素
                    stack[j] = stack[j + 1];
                }
                
                stack[j] = visited[i];  //栈顶元素赋予新值

            }
        }else{  //元素在堆栈中,要把它从栈中拿到栈顶
            int j;

            //从存在位置往前移,覆盖已存在元素
            for( j = index ; j < usedSpace - 1 ; j++ ){
                stack[j] = stack[j + 1];
            }
            
            stack[j] = visited[i];

        }
    }

    cout << "\n\n栈中元素从栈底到栈顶依次是:\n";
    
    for( int i = 0 ; i < usedSpace ; i++ ){
        cout << stack[i] <<" ";
    }

    return 0;
}

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值