1. 程式人生 > >記憶體管理(3602017秋招真題)

記憶體管理(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;
}