您的位置:首页 > 编程语言 > Java开发

用java实现动态分区

2015-12-12 15:14 453 查看
用java实现动态分区问题,运用链表的知识,实现分配和回收,这个问题在回收过程中需要考虑8种情况,并按照相应的情况决定是否对空闲分区进行合并。

package 动态分区;

public class Area {

private int number;

private String name;

private int startaddress;

private int size1;

private int flag;

public Area(){};

public Area(String name,int size1,int startaddress,int flag)

{

this.name = name;

this.size1 = size1;

this.startaddress = startaddress;

this.flag = flag;

}

public Area(String name,int size1)

{

this.name = name;

this.size1 = size1;

}

public void setName(String name)

{

this.name = name;

}

public String getName(){

return name;

}

public void setSize(int size1)

{

this.size1 = size1;

}

public int getSize()

{

return size1;

}

public void setFlag(int flag)

{

this.flag = flag;

}

public int getFlag()

{

return flag;

}

public void setStartaddress(int startaddress)

{

this.startaddress = startaddress;

}

public int getStartaddress()

{

return startaddress;

}

}

package 动态分区;

import java.util.ArrayList;

import java.util.List;

import java.util.Scanner;

public class Allocation {

static List <Area> e = new ArrayList<Area>();

public static void alloction(Area a) //分配函数

{

int i;

for( i = 0;i < e.size(); i++)

{

if(a.getSize() < (e.get(i)).getSize() && (e.get(i)).getFlag() == 0)

{

if((e.get(i)).getSize() - a.getSize() <= 2)

{

(e.get(i)).setName(a.getName());

}

else

{

a.setStartaddress((e.get(i)).getStartaddress());

(e.get(i)).setStartaddress((e.get(i)).getStartaddress() + a.getSize());

(e.get(i)).setSize((e.get(i)).getSize() - a.getSize());

e.add(i,a);

}

e.get(i).setFlag(1);

System.out.println("分配成功!");

break;

}

}

if(i == e.size())

{

System.out.println("没有足够的空间可以分配!");

}

}

public static void Recycle(String name) //回收函数

{

int i ;

for(i = 0; i < e.size(); i++)

{

if(name.equals((e.get(i)).getName()))

{

if(i >= 1 && i < e.size() - 1)

{

if((e.get(i - 1)).getFlag() == 0&&(e.get(i + 1)).getFlag() == 1) //回收区前一个空闲后一个占用状态时

{

(e.get(i - 1)).setSize((e.get(i - 1)).getSize() + (e.get(i)).getSize());

(e.get(i - 1)).setName("");

(e.get(i - 1)).setFlag(0);

e.remove(i);

}

else if((e.get(i + 1)).getFlag() == 0&&(e.get(i - 1)).getFlag() == 1) //回收区前一个占用后一个空闲状态时

{

(e.get(i)).setSize((e.get(i+1)).getSize() + (e.get(i)).getSize());

(e.get(i)).setName("");

(e.get(i)).setFlag(0);

e.remove(i + 1);

}

else if((e.get(i + 1)).getFlag() == 0&&(e.get(i - 1)).getFlag() == 0) //回收区前一个空闲后一个空闲状态时

{

(e.get(i - 1)).setSize((e.get(i - 1)).getSize() + (e.get(i)).getSize() + (e.get(i + 1)).getSize());

(e.get(i - 1)).setName("");

(e.get(i - 1)).setFlag(0);

e.remove(i);

e.remove(i);

}

else if((e.get(i + 1)).getFlag() == 1&&(e.get(i - 1)).getFlag() == 1) //回收区前一个占用后一个占用状态时

{

(e.get(i)).setName("");

(e.get(i)).setFlag(0);

}

}

else if(i == 0 && (e.get(i + 1)).getFlag() == 1) //当回收区为链表第一个并且回收区后一个为占用状态时

{

(e.get(i)).setName("");

(e.get(i)).setFlag(0);

}

else if(i == 0 && (e.get(i + 1)).getFlag() == 0) //当回收区为链表第一个并且回收区后一个为空闲状态时

{

(e.get(i)).setName("");

(e.get(i)).setSize((e.get(i+1)).getSize() + (e.get(i)).getSize());

(e.get(i)).setFlag(0);

e.remove( i+1);

}

else if(i == e.size() - 1 && (e.get(i - 1)).getFlag() == 1) //当回收区为链表最后一个并且回收区后一个为占用状态时

{

(e.get(i)).setName("");

(e.get(i)).setFlag(0);

}

else if(i == e.size() - 1 && (e.get(i - 1)).getFlag() == 0) //当回收区为链表最后一个并且回收区后一个为空闲状态时

{

(e.get(i-1)).setName("");

(e.get(i-1)).setSize((e.get(i-1)).getSize() + (e.get(i)).getSize());

(e.get(i)).setFlag(0);

e.remove( i);

}

System.out.println("回收成功!");

break;

}

}

if(i == e.size())

{

System.out.println("回收区名字错误!");

}

}

public static void display() //显示函数

{

System.out.println("分区号\t作业名\t起始地址\t分区大小\t状态\t");

for(int i = 0; i < e.size(); i++)

{

System.out.println((i+1)+"\t"+(e.get(i)).getName()+"\t"+(e.get(i)).getStartaddress()+"\t"+(e.get(i)).getSize()+"\t"+(e.get(i)).getFlag());

}

}

public static void menu() //菜单函数

{

System.out.println("1.分配内存");

System.out.println("2.回收内存");

System.out.println("3.显示分配结果");

System.out.println("4.退出");

System.out.println("请选择要进行的操作:");

}

}

package 动态分区;

import java.util.Scanner;

public class Dong {

public static void main(String[] args)

{

Area b = new Area("",1024,0,0);

Allocation.e.add(b);

Allocation.menu();

Scanner sc = new Scanner(System.in);

int y = sc.nextInt();

while(y >= 1 && y <= 4)

{

switch(y)

{

case 1:
System.out.println("请输入要分配的内存的名称:");

Scanner sd = new Scanner(System.in);

String c = sd.nextLine();

System.out.println("请输入要分配的内存的大小");

Scanner sa = new Scanner(System.in);

int q = sa.nextInt();

Area a = new Area(c,q);

Allocation.alloction(a);

break;

case 2:

System.out.println("请输入要回收的内存的名称:");

Scanner se = new Scanner(System.in);

String w = se.nextLine();

Allocation.Recycle(w);

break;

case 3:

Allocation.display();

break;

case 4:

System.exit(0);

}

Allocation.menu();

Scanner sf = new Scanner(System.in);

y = sf.nextInt();

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: