華爲機試--模擬內存分配

模擬一個連續的內存塊,其大小固定爲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");//不存在
				 }
				 
			 }
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章