内存管理(3602017秋招真题)

题目描述
物联网技术的蓬勃发展,各种传感器纷纷出现。小B所在的项目组正在开发一个物联网项目,她们在研究设计一种新的传感器。这种传感器有自己的基本处理单元,具有一定的自主性,能够进行简单的数据收集、处理、存储和传输。为降低系统功耗并保证系统可靠性和可控性,他们要对内存进行基本的管理。研究小组计划开发一个实验性内存管理器,实现对内存的分配、释放和整理。对应的接口为new、del和def,使用语法为:
new size:分配size字节大小的内存块,返回该内存块的句柄handle,size为正整数;
del handle:释放句柄handle指向的内存块;
def:整理内存碎片,将所有已分配内存块按地址从低到高的顺序迁移,使空闲内存碎片在高地址端拼接在一起;
初始内存为 initSize 字节大小的整片空闲内存,编号为 1 到 initSize 。
new size操作中,若存在不小于size的连续空闲内存,则按照小地址优先的原则从空闲内存区域中分配size大小的内存块,标记该内存块状态为已分配,并返回指向该内存块的句柄。若无法分配,则返回空(NULL)。
del handle操作释放由handle标记的内存块,标记被释放的内存状态为空闲。若handle为无效句柄,则返回ILLEGAL_OPERATION。
def 完成内存整理工作,无返回值。
根据设计,每次成功内存分配返回的句柄为一个正整数,从1开始,依次计数。失败的存储分配操作不影响计数。
项目小组将此项任务分配给小B,小B向你求助,你能帮她吗?
输入
输入中有多组测试数据。每组测试数据的第一行为两个正整数T和MaxMem(1<=T<=10000, 1<=MaxMem<=10000),其中T为操作次数,MaxMem为初始内存大小,随后有T行操作指令。

对每组测试数据,按操作顺序输出操作结果。对每个new操作,在单独行中输出结果,成功时输出其返回句柄值,失败则输出NULL。若del操作失败,输出ILLEGAL_OPERATION。def不产生输出。

样例输入
6 10
new 5
new 3
del 1
new 6
def
new 6
样例输出
1
2
NULL
3

这种的数据不是很强,用模拟可以过,模块化一下,调用三个函数就好了,具体实现可以参考代码

AC代码:

 

#include <algorithm>
#include <vector>
#include <iostream>
# define f(i,m,n) for(int i=m; i<=n; i++)
# define mem(s) memset(s, 0, sizeof(s));
using namespace std;
struct node {
	int h, x, y;
};
int T, mmax, Handle;
string ope;
vector<node> v;
int newFunc(int Size) {
	int len = v.size();
	if (v.size() == 0) {
		if (Size <= mmax) {
			node temp;temp.x = 1;temp.y = 1 + Size - 1;temp.h = ++Handle;
			v.push_back(temp);return Handle;
		}
		else {
			return -1;
		}
	}
	else {
		if (1 + Size - 1 < v[0].x) {
			node temp;temp.x = 1;temp.y = 1 + Size - 1; temp.h = ++Handle;
			v.insert(v.begin(), temp);
			return Handle;
		}
		else {
			f(i, 0, len - 2) {
				if (v[i + 1].x - v[i].y - 1 >= Size) {
					node temp;temp.x = v[i].y + 1;temp.y = temp.x + Size - 1;temp.h = ++Handle;
					v.insert(v.begin() + i + 1, temp);
					return Handle;
				}
			}
			if (mmax - v[len - 1].y >= Size) {
				node temp;temp.x = v[len - 1].y + 1;temp.y = temp.x + Size - 1;temp.h = ++Handle;
				v.push_back(temp);
				return Handle;
			}

			return -1;
		}
	}
	
}

void defFunc() {
	if (v.size() == 0)return;
	int ll = v[0].y - v[0].x, l=v.size();
	v[0].x = 1;v[0].y = v[0].x + ll;
	f(i, 1, l - 1) {
		int len = v[i].y - v[i].x;
		v[i].x = v[i - 1].y + 1;
		v[i].y = v[i].x + len;
	}
}

int delFunc(int H) {
	int l = v.size();
	int f = 0;
	f(i, 0, l - 1) {
		if (v[i].h == H) {
			v.erase(v.begin() + i);
			return i;
		}
	}
	return -1;
}
int main() {
	while (cin >> T >> mmax) {
		v.clear();
		Handle = 0;
		f(i, 1, T) {
			cin >> ope;
			int x;
			if (ope == "new") {
				cin >> x;
				int flage=newFunc(x);
				if (flage == -1) {
					printf("NULL\n");
				}
				else printf("%d\n", flage);
			}
			else if (ope == "del") {
				cin >> x;
				int flage=delFunc(x);
				if (flage == -1)printf("ILLEGAL_OPERATION\n");
			}
			else {
				defFunc();
			}
		}
	}
	return 0;
}

 

 

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值