import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
class Disk{
private int n;
private int m;
private String direction;
private ArrayList<Integer> disk = new ArrayList<Integer>();
public Disk(int n,int m,String direction){
this.n=n;
this.m=m;
this.direction=direction;
}
public void Init() {
Scanner in=new Scanner (System.in);
System.out.println("请输入请求队列:(输入完毕请以“/”结束并回车)");
while (in.hasNextInt()) {
disk.add(in.nextInt());
}
}
public void FCFS(){
System.out.println("********************FIFS Algorithm*******************");
int amount=disk.size();
int distance=Math.abs(disk.get(0)-m);
for(int i=1;i<amount;i++) {
distance+=Math.abs(disk.get(i)-disk.get(i-1));
}
System.out.println("磁头移动顺序:");
System.out.print(m);
for(int k:disk) {
System.out.print("→"+k);
}
System.out.println();
System.out.println("磁头移动总量:"+distance);
}
public void SSTF() {
System.out.println("********************SSTF Algorithm*******************");
ArrayList<Integer> temp=new ArrayList<Integer>();
for(int i=0;i<disk.size();i++) {
temp.add(disk.get(i));
}
int c=m;//c表示当前位置
int distance=0;
System.out.println("磁头移动顺序:");
System.out.print(m);
while(temp.size()!=0) {
int min=Math.abs(c-temp.get(0));
for(int i=0;i<temp.size();i++) {
int d=Math.abs(c-temp.get(i));
if(d<min) {
min=d;
}else {
}
}
for(int i=0;i<temp.size();i++) {
if(min==Math.abs(c-temp.get(i))) {
c=temp.get(i);
System.out.print("→"+temp.get(i));
distance+=min;
temp.remove(i);
}
}
}
System.out.println();
System.out.println("磁头移动总量:"+distance);
}
public void SCAN() {
System.out.println("********************SCAN Algorithm*******************");
int distance=0;
int count1=0;
int count2=0;
int c1=0;
int c2=0;
for(int i=0;i<disk.size();i++) {
if(m<=disk.get(i)) {
c2++;
}else {
c1++;
}
}
int temp1[]=new int[c1];
int temp2[]=new int[c2];
for(int i=0;i<disk.size();i++) {
if(m<=disk.get(i)) {
temp2[count2]=disk.get(i);
count2++;
}else {
temp1[count1]=disk.get(i);
count1++;
}
}
Arrays.sort(temp1);
Arrays.sort(temp2);
System.out.println("磁头移动顺序:");
System.out.print(m);
if("向外".equals(direction)) {
for(int i=0;i<count2;i++) {
System.out.print("→"+temp2[i]);
}
for(int i=count1-1;i>=0;i--) {
System.out.print("→"+temp1[i]);
}
if(count1==0) {
distance=(temp2[count2-1]-m);
}else {
distance=(n-m)+(n-temp1[0]);
}
}else {
for(int i=count1-1;i>=0;i--) {
System.out.print("→"+temp1[i]);
}
for(int i=0;i<count2;i++) {
System.out.print("→"+temp2[i]);
}
if(count2==0) {
distance=m-temp1[0];
}else {
distance=m+temp2[count2-1];
}
}
System.out.println();
System.out.println("磁头移动总量:"+distance);
}
public void ESA() {
System.out.println("********************电梯调度算法*******************");
int distance=0;
int count1=0;
int count2=0;
int c1=0;
int c2=0;
for(int i=0;i<disk.size();i++) {
if(m<=disk.get(i)) {
c2++;
}else {
c1++;
}
}
int temp1[]=new int[c1];
int temp2[]=new int[c2];
for(int i=0;i<disk.size();i++) {
if(m<=disk.get(i)) {
temp2[count2]=disk.get(i);
count2++;
}else {
temp1[count1]=disk.get(i);
count1++;
}
}
Arrays.sort(temp1);
Arrays.sort(temp2);
System.out.println("磁头移动顺序:");
System.out.print(m);
if("向外".equals(direction)) {
for(int i=0;i<count2;i++) {
System.out.print("→"+temp2[i]);
}
for(int i=count1-1;i>=0;i--) {
System.out.print("→"+temp1[i]);
}
if(count1==0) {
distance=(temp2[count2-1]-m);
}else {
distance=(temp2[count2-1]-m)+(temp2[count2-1]-temp1[0]);
}
}else {
for(int i=count1-1;i>=0;i--) {
System.out.print("→"+temp1[i]);
}
for(int i=0;i<count2;i++) {
System.out.print("→"+temp2[i]);
}
if(count2==0) {
distance=m-temp1[0];
}else {
distance=m-temp1[0]+temp2[count2-1];
}
}
System.out.println();
System.out.println("磁头移动总量:"+distance);
}
}
public class Main3{
public static void main(String[] args) {
Scanner in =new Scanner (System.in);
System.out.println("磁盘上的柱面数:(逻辑值从零开始)");
int n=in.nextInt();
System.out.println("当前所处磁道位置:");
int m=in.nextInt();
System.out.println("存取臂当前移动方向:(向内 or 向外)");
String direction=in.next();
Disk disk1 = new Disk(n,m,direction);
disk1.Init();
while(true) {
System.out.println("请输入想要实现的算法: 1:FCFS 2:SSTF 3:SCAN 4:电梯调度算法 5:退出");
int choice=in.nextInt();
switch(choice) {
case 1:
disk1.FCFS();break;
case 2:
disk1.SSTF();break;
case 3:
disk1.SCAN();break;
case 4:
disk1.ESA();break;
case 5:
System.out.println("退出成功!");
System.exit(0);break;
}
}
}
}