简易内存池

  • 请实现一个简易内存池,根据请求命令完成内存分配和释放。
  • 内存池支持两种操作命令,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);
    }
}

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务