模擬一個連續的內存塊,其大小固定爲100字節:
- 1.用戶輸入"REQUEST=10"表示從內存中分配一個連續的大小爲10字節的空間,當分配成功時,輸出內存區塊的首地址,分配失敗(內存空間不足)時輸出"error"
- 2.用戶輸入“RELEASE=0”,表示釋放首地址爲0所對應的區塊,如果不存在相應區塊,則輸出“error”,反之不輸出
public class Test003 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int questPos = 0 ; //申請指針
int releasePos = 0 ;//釋放指針
int[] cache = new int[100];
for(int i = 0 ; i < 100 ; i ++){
cache[i] = 0 ;
}
Map<Integer,Integer> requesrRcord = new HashMap<>();
while (in.hasNextLine()) {
String sre = in.nextLine().toString().trim();
if(sre.startsWith("REQ")){
//申請
int size = Integer.parseInt(sre.split("\\=")[1]);
if(size == 0){
System.out.println("error");
}else if(questPos + size <= 100){
//沒有釋放過
requesrRcord.put(questPos, size);//成功分配時記錄分配信息用於釋放
System.out.println(questPos);
int cap = questPos+size;
for(int i = questPos ; i < cap ;i++ , questPos ++ ){
cache[i] = 1;
}
}else if(questPos + size > 100 && releasePos != 0){
//執行過釋放,則從0開始遍歷尋找一個連續尺寸爲size的內存區塊
int linkSize = 0 ;//連續區間大小
int linkPos = -1 ;//連續區間內存地址
for(int i = 0 ; i < releasePos ;i++){
if(cache[i] == 0 ){
++linkSize;
if(linkSize == size){
//已經找到可以分配的空間
break;
}
}else{
//爲1時表名當前地址已佔用
linkSize = 0 ;
linkPos = i;
}
}
if(linkSize >= size){
requesrRcord.put(linkPos +1, size);//成功分配時記錄分配信息用於釋放
System.out.println(linkPos +1);
for(int i = (linkPos +1);i< (linkPos +1+size) ; i ++){//
//分配地址
cache[i] = 1;
}
}else{
//不存在這麼大的連續內存塊了
System.out.println("error");
}
}else{
System.out.println("error");
}
}else if(sre.startsWith("REL")){
//釋放
Integer addr = Integer.parseInt(sre.split("\\=")[1]);//釋放地址
if(requesrRcord.containsKey(addr)){
int capSize = requesrRcord.get(addr);
for(int i = addr ; i < capSize ; i++){
cache[i] = 0;
releasePos = addr + capSize;
}
}else{
System.out.println("error");//不存在
}
}
}
}
}