main函数:
public class czxt {
// 模拟动态分区首次适应分配和回收算法
static ArrayList wei=new ArrayList();
static ArrayList yi =new ArrayList();
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
fenqu fenqu1=new fenqu(wei.size()+1,60,200,1);
wei.add(fenqu1);
while (true) {
System.out.println("********************");
System.out.println("* 功能菜单 *");
System.out.println("********************");
System.out.println("* 1…分配 *");
System.out.println("* 2…回收 *");
System.out.println("* 3…显示 *");
System.out.println("* 0…退出 *");
System.out.println("********************");
System.out.println("请输入您需要的功能:(0-3):");
int x = sc.nextInt();
if(x==0){
System.out.println("感谢使用!");
break;
}
if(x==1){
fenpei();
}if(x==2){
huishou();
}if(x==3){
xianshi();
}if(x<0||x>3){
System.out.println("输入错误请重新输入!");
}
}
}
public static void fenpei(){
System.out.println("请输入作业名:");
String name= sc.next();
System.out.println("请输入作业长度:");
int x = sc.nextInt();
int p=0;
int c=0;
// 判断已分配区中是否含有相同作业名的作业
for (int i = 0; i < yi.size(); i++) {
if(yi.get(i).getName().equals(name)){
System.out.println("请更换作业名!");
p++;
break;
}
}
if(p==0){
for (int i = 0; i < wei.size(); i++) {
if(wei.get(i).getLength()>=x){
yifenqu y=new yifenqu(name,wei.get(i).getStart(),x,1);
yi.add(y);
wei.get(i).setStart(wei.get(i).getStart()+x);
wei.get(i).setLength(wei.get(i).getLength()-x);
// ||||||||||||
System.out.println("作业添加成功!");
c++;
break;
}
}
if(c==0){
int a=0;
// 判断合并的空闲分区大小是否可以容纳该作业
for (int i = 0; i < wei.size(); i++) {
a=a+wei.get(i).getLength();
}
if(a>=x){
// 紧凑算法:将所有已占用的空间放置在一起,使其首地址为空闲分区首地址,作业依次排列,
// 将未分区地址放在所有作业的下边。
int start=yi.get(0).getStart();
// 找出首地址最小的值,作为第一个作业的首地址
for (int i = 0; i < yi.size(); i++) {
if(yi.get(i).getStart() arr=new ArrayList<>();
// 在已分配区中寻找作业名相同的作业
for (int i = 0; i < yi.size(); i++) {
if(yi.get(i).getName().equals(name)){
fen.setStart(yi.get(i).getStart());
fen.setLength(yi.get(i).getLength());
yi.remove(i);
c++;
break;
}
}
if(c==0){
System.out.println("已分配区表中不含此作业!");
}
if(c!=0){
// 为该作业的中的部分值赋值
fen.setXuhao(wei.size()+1);
fen.setZhuangtai(0);
wei.add(fen);
// 合并分区
for (int i = 0; i < wei.size(); i++) {
for (int z = wei.size()-1; z > 0 ; z--) {
if(wei.get(i).getStart()+wei.get(i).getLength()==wei.get(z).getStart()){
wei.get(i).setLength(wei.get(i).getLength()+wei.get(z).getLength());
wei.get(i).setStart(wei.get(i).getStart());
arr.add(z);
}
else if(wei.get(i).getStart()==wei.get(z).getStart()+wei.get(z).getLength()){
wei.get(z).setLength(wei.get(z).getLength()+wei.get(i).getLength());
wei.get(z).setStart(wei.get(z).getStart());
arr.add(i);
}
}
}
// 将分区中被合并的区块从列表中移除
for (int i = 0; i < arr.size() ; i++) {
int e = arr.get(i) - i;
wei.remove(e);
}
wei.get(0).setZhuangtai(1);
System.out.println("作业回收成功!");
}
}
public static void xianshi(){
for (int i = 0; i < wei.size(); i++) {
// if(wei.get(i).getZhuangtai()==1){
if(wei.get(i).getLength()>=1){
System.out.println(wei.get(i));
}
// }
}
for (int j = 0; j < yi.size(); j++) {
System.out.println(yi.get(j));
}
}
}
未分区实体类:
public class fenqu {
private int xuhao;
private int start; //始址
private int length; //长度
private int zhuangtai; //状态
@Override
public String toString() {
return "未分配分区表{" +
"序号=" + xuhao +
", 始址(K)=" + start +
", 长度(KB)=" + length +
", 状态=" + zhuangtai +
'}';
}
public fenqu() {
}
public fenqu(int xuhao, int start, int length, int zhuangtai) {
this.xuhao = xuhao;
this.start = start;
this.length = length;
this.zhuangtai = zhuangtai;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getZhuangtai() {
return zhuangtai;
}
public void setZhuangtai(int zhuangtai) {
this.zhuangtai = zhuangtai;
}
public int getXuhao() {
return xuhao;
}
public void setXuhao(int xuhao) {
this.xuhao = xuhao;
}
}
已分区实体类:
ublic class yifenqu{
private String name;
private int start; //始址
private int length; //长度
private int zhuangtai; //状态
@Override
public String toString() {
return "已分配区说明表{" +
"名字='" + name + ''' +
", 始址=" + start +
", 长度=" + length +
", 状态=" + zhuangtai +
'}';
}
public yifenqu() {
}
public yifenqu(String name, int start, int length, int zhuangtai) {
this.name = name;
this.start = start;
this.length = length;
this.zhuangtai = zhuangtai;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getZhuangtai() {
return zhuangtai;
}
public void setZhuangtai(int zhuangtai) {
this.zhuangtai = zhuangtai;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}



