用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();
}
}
}
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();
}
}
}
相关文章推荐
- SpringMVC上传下载
- java内部类之方法内部类
- java线程学习
- 类的加载过程
- 往android - Eclipse中导入新项目时,出现Remove @Override annotation错误提示
- 【java】当文件目录不存在时自动创建文件目录
- java中内部类之成员内部类
- LeetCode 155 : Min Stack (Java)
- JAVA-策略设计模式
- MySQL入门接触记录--从安装到Java通过JDBC连接MySQL数据库
- 好用的eclipse插件收集
- java文件编译后,同一个文件出现"$"的class
- Spring mvc 报错:No qualifying bean of type [java.lang.String] found for dependency:
- Eclipse不能不说的秘密:远程Debug
- Java基础3——IO
- 重新安装JDK造成weblogic实例无法无法启动问题
- JAVA-工厂方法设计模式
- 关于Java的软引用及弱引用
- netbeans 开启调试
- activiti集成spring异常(DbSqlSession)