- 请实现一个简易内存池,根据请求命令完成内存分配和释放。
- 内存池支持两种操作命令,REQUEST和RELEASE,其格式为:
- REQUEST=请求的内存大小 表示请求分配指定大小内存,如果分配成功,返回分配到的内存首地址;如果内存不足,或指定的大小为0,则输出error。
- RELEASE=释放的内存首地址 表示释放掉之前分配的内存,释放成功无需输出,如果释放不存在的首地址则输出error。
import java.util.*;
public class Question33 {
public static final String REQUEST = "REQUEST";
public static final String RELEASE = "RELEASE";
// 0 表示未分配 1表示已经分配
public static final int[] RAM_ARR = new int[100];
// 存放分配过的内存的首地址及长度
static final HashMap<Integer, Integer> MAP = new HashMap<>();
public static int answer(String[] arr){
int num = Integer.parseInt(arr[1]);
if (arr[0].equals(REQUEST)){
if (num == 0){
return -1;
}
int len = 0;
for (int i = 0; i < RAM_ARR.length; i++) {
if (RAM_ARR[i] == 0){
for (int j = i; j < RAM_ARR.length; j++) {
if (RAM_ARR[j] == 0){
len++;
}else {
i = len - 1;
len = 0;
break;
}
if (len == num){
for (int k = i; k < i + num; k++) {
RAM_ARR[k] = 1;
}
MAP.put(i, num);
return i;
}
}
}
}
return -1;
}else {
if (MAP.containsKey(num)){
Integer len = MAP.get(num);
MAP.remove(num);
for (int i = num; i < len + num; i++) {
RAM_ARR[i] = 0;
}
return -2;
}else {
return -1;
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
scanner.useDelimiter("\n");
int nums = scanner.nextInt();
List<String> list = new ArrayList<>();
while (nums > 0){
String str = scanner.next();
String[] split = str.split("=");
int answer = answer(split);
if (answer != -2) {
list.add(answer == -1 ? "error" : answer + "");
}
nums--;
}
list.forEach(System.out :: println);
}
}