OJ_空闲块

该C++代码实现了一个内存管理功能,通过输入一组大小不等的内存块,根据请求动态分配并调整空闲块,最后输出所有剩余的内存块信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题干

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

C++实现

/**
输入样例:
12
1024 2048
8192 512
16384 1024
32768 8192
65536 8192
77824 1024
80896 3072
86016 1024
91136 5120
99328 512
104448 1024
112640 3072
1024 2560 10240 512 1024 6400 512 -1
输出样例:
104448 1024
112640 3072
1024 2048
8192 512
32768 1792
65536 8192
77824 1024
91136 5120
 */
#include <stdio.h>
#include <list>
using namespace std;
struct Block {
    int startPos;
    int blockSize;
};
int main() {

    list<Block> freeList;
    int n;
    scanf("%d", &n);
    //输入
    for (int i = 0; i < n; ++i) {
        Block block;
        scanf("%d%d", &block.startPos, &block.blockSize);
        freeList.push_back(block);
    }

    int request;
    list<Block>::iterator it;

    while (1) {
        scanf("%d", &request);
        if (request == -1) {
            break;
        }

        list<Block>::iterator toAlloc = freeList.end();//表示要分配出去的盘块,开始初始化为无意义的freeList.end()
        int curLeast = 1e9+1;//记录最小的符合空闲块申请的大小
        for (it = freeList.begin(); it != freeList.end(); ++it) {
            if (it->blockSize == request) {
                toAlloc = it;
                break;
            }
            else if (it->blockSize > request && it->blockSize < curLeast) {
                toAlloc = it;
                curLeast = it->blockSize;
            }
        }

        if (toAlloc != freeList.end()) {//如果找到了可以分配的盘块

            while (toAlloc != freeList.begin()) {//要分配的盘块不是第一块
                Block front = freeList.front();
                freeList.pop_front();
                freeList.push_back(front);//把头块挂成尾块,方便出队
            }

            if (toAlloc->blockSize == request) {
                freeList.pop_front();
            }

            else {
                toAlloc->blockSize -= request;
            }
        }
    }

    //打印
    for (it = freeList.begin(); it != freeList.end(); ++it) {
        printf("%d %d\n", it->startPos, it->blockSize);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

frostmelody

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值