请实现一个简易内存池
根据请求命令完成内存分配和释放
内存池支持两种操作命令
REQUEST
和RELEASE
其格式为
REQUEST=请求的内存大小
表示请求分配指定大小内存
如果分配成功,返回分配到的内存首地址
如果内存不足,或指定的大小为零则输出error
RELEASE=释放的内存首地址
表示释放掉之前分配的内存
释放成功无需输出
如果释放不存在的首地址
则输出error
注意:
首行为整数N
表示操作命令的个数
取值范围0<N<=100
接下来的N
行
每行将给出一个操作命令
操作命令和参数之间用”=“
分割
输出描述见题目输出要求
2
REQUEST=10
REQUEST=20
0
10
5
REQUEST=10
REQUEST=20
RELEASE=0
REQUEST=20
REQUEST=10
0
10
30
0
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.TreeMap;
/**
* Created with IntelliJ IDEA.
* Author: Amos
* E-mail: amos@amoscloud.com
* Date: 2022/8/30
* Time: 16:24
* Description:
*/
public class Main0114 {
static class AllocatedMemory {
private final TreeMap<Integer, Integer> hasAllocated;
AllocatedMemory() {
hasAllocated = new TreeMap<>();
}
String request(int size) {
int addressDefaultHead = 0;
int addressHead = addressDefaultHead;
if (size <= 0 || size > 100) {
return "error";
}
if (hasAllocated.isEmpty()) {
hasAllocated.put(addressDefaultHead, size);
} else {
List<Integer> headList = new ArrayList<>(hasAllocated.keySet());
for (Integer integer : headList) {
if (integer - addressHead >= size) {
hasAllocated.put(addressHead, addressHead + size);
} else {
addressHead = hasAllocated.get(integer);
}
}
int addressDefaultEnd = 100;
if (size <= addressDefaultEnd - addressHead) {
hasAllocated.put(addressHead, addressHead + size);
} else {
return "error";
}
}
return String.valueOf(addressHead);
}
boolean release(int startAddress) {
if (hasAllocated.containsKey(startAddress)) {
hasAllocated.remove(startAddress);
return true;
}
return false;
}
public static void main(String[] args) {
AllocatedMemory allocatedMemory = new AllocatedMemory();
try (Scanner scanner = new Scanner(System.in)) {
int line = Integer.parseInt(scanner.nextLine());
String[][] ins = new String[line][2];
for (int i = 0; i < line; i++) {
ins[i] = scanner.nextLine().split("=");
if (ins[i][0].startsWith("REQUEST")) {
System.out.println(allocatedMemory.request(Integer.parseInt(ins[i][1])));
} else {
boolean ret = allocatedMemory.release(Integer.parseInt(ins[i][1]));
if (!ret) {
System.out.println("error");
}
}
}
}
}
}
}