Bir
fabrikadan üretim hatası ile çıkan arabalar, daha sonra kaza testlerinde
kullanılmak için bir otoparka yerleştirilmektedir. Otomobiller, otoparkın ilk
yani 1. katına bir kuyruk, 2. katına bir yığıt ve 3. katına da bir dairesel bağlaçlı
liste düzeninde yerleştirilip alınmaktadır. Otopark 6 katlı olup bu yapı üst
katlarda da tekrarlanmaktadır.
Random bir kat numarası seçilmekte ve ardından 1 adet araba kaza
testi için otoparktan alınmaktadır. Sadece arabaların bağlaçlı liste düzeninde
yerleştirildiği katlarda, alınacak araba balon problemine benzer şekilde n adet
araba atlanarak seçilmekte ve bağlaçlı listelerde kalınan yer
tutulmaktadır.
Java dilinde
bu problemin çözümünü
ve simülasyonunu yapan programı yazınız:
a)
Tüm veri yapılarına 30’ar adet araba yerleştiriniz ve
listeyi ekrana yazdırınız. Arabaların her birinin farklı renklerde olduğunu
düşünüp Renkleri (Kırmızı, Yeşil, Mavi,… gibi) “text” olarak temsil
edebilirsiniz. (Java’nın hazır Stack, Queue sınıfları kullanılmalı; Dairesel
bağlaçlı listeyi ise kendiniz tasarlamalısınız.) İpucu: Kolaylık açısından,
katları vektörde temsil edebilirsiniz.
b)
Tüm arabalar bitene kadar yukarıda anlatılan işlemi
tekrarlayınız ve her turda, katlarda kalanların, silinenlerin renklerini ekrana
yazdırınız. Son kalan arabanın rengini belirtiniz.
c)
Kullandığınız bilgisayarın 3 saniyede ortalama kaç
adet otopark problemi çözebildiğini hesaplatınız. Zamanı hesaplarken ekrana
yazdırma, girdi alma gibi komutları devre dışı bırakacak şekilde kodu
ayarlayınız.
Araba.java
public class Araba {
public int no;
private String renk;
public Araba sonraki;
public Araba(int no)
{
this.no = no;
String[] renkler = {"Siyah","Mavi","Yesil","Kırmızı","Turuncu","Sarı","Turuncu","Gri","Beyaz"};
this.renk = renkler[(int) (Math.random() * renkler.length)];
}
public void cikaniYazdir()
{
System.out.print(renk + " ");
}
public String toString()
{
return renk;
}
}
DaireselBaglıListe.java
public class DaireselBaglıListe {
Araba etkin;
int katNo;
public DaireselBaglıListe(int katNo)
{
this.katNo = katNo;
etkin = null;
}
public void ekle(int no)
{
if(etkin == null) // liste bos ise
{
Araba yeniAraba = new Araba(no);
etkin = yeniAraba;
etkin.sonraki = etkin; // dairesel oldugu icin
}
else
{
Araba yeniAraba = new Araba(no);
Araba simdiki = etkin;
Araba gecici = etkin;
do {
gecici = gecici.sonraki;
simdiki = gecici.sonraki;
} while (simdiki != etkin);
etkin.sonraki = yeniAraba;
yeniAraba.sonraki = etkin;
}
}
public void cikar(int n)
{
Araba cikan = etkin.sonraki; // cikarilacak olan
if(n == 1) // teker teker cikarilacaksa
{
while(cikan.sonraki != etkin)
{
cikan = cikan.sonraki;
}
System.out.println(katNo+".kattaki "+n+".sıradaki arabalar cikarilmaktadır. "+"\nListedeki arabalar:\n");
yazdir();
System.out.println("Cikarilan Araba ");
etkin.cikaniYazdir();
cikan.sonraki = etkin.sonraki;
etkin = etkin.sonraki;
System.out.println("\nListedeki arabalar:\n");
yazdir();
}
else
{
System.out.print("\n"+katNo+".katta ilk arabadan itibaren her "+n+".araba cikarilmaktadır.\n\n");
System.out.println(katNo + ". katta olan arabalar:");
yazdir();
System.out.println();
int sayac = 1;
while (sayac < n - 1) {// n defa dönmek için..
sayac++;
etkin = etkin.sonraki;
cikan = cikan.sonraki;
}
System.out.println("\n"+katNo+".katta "+"cikarilan; ");
cikan.cikaniYazdir();// her turda kat numarası ve n değerinin
// yazdırılması
System.out.println();// bir satır alta geçmek için
etkin.sonraki = cikan.sonraki;
etkin = etkin.sonraki;
cikan = cikan.sonraki.sonraki;
}
System.out.println("\n"+katNo+".katta "+"kalanlar;\t");
yazdir();// ekrana yazdirma methodu
System.out.println();
}
void yazdir() {
Araba dolas;
dolas = etkin;
do{
dolas.cikaniYazdir();
}while(dolas != etkin);
}
public boolean doluMu() {
if (etkin == etkin.sonraki)
return false;
else
return true;
}
public int bosMu() {
if (etkin == null)
return 1;
else
return 0;
}
}
Test.java
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Stack;
public class Test {
public static void main(String args[])
{
int n = 0;
int kontrol1 = 0;
int kontrol2 = 0;
String[] kalanlar = {null,null,null,null,null,null}; // katlarda son kalan arabalar
do{
System.out.println("Kaç arabada bir çıkarılsın (bir araba)");
Scanner input = new Scanner(System.in);
n = input.nextInt();
}while(n <= 0);
int sayac1 = 1; // baglı listeli katlarda araba eklerken kullanılacak
int sayac2 = 1;
int kacinciKat = 3;
Stack<Araba> kat5 = new Stack<Araba>();
Stack<Araba> kat2 = new Stack<Araba>();
Queue<Araba> kat1 = new LinkedList<Araba>();
Queue<Araba> kat4 = new LinkedList<Araba>();
for(int i=1;i<31;i++)
{
Araba araba = new Araba(i);
kat2.push(araba);
}
for(int j=1;j<31;j++)
{
Araba araba = new Araba(j);
kat5.push(araba);
}
for(int m=1;m<31;m++)
{
Araba araba = new Araba(m);
kat1.add(araba);
}
for(int k=1;k<31;k++)
{
Araba araba = new Araba(k);
kat4.add(araba);
}
Iterator<Araba> itr1=kat1.iterator();
Iterator<Araba> itr2=kat2.iterator();
Iterator<Araba> itr3=kat5.iterator();
Iterator<Araba> itr4=kat4.iterator();
System.out.print("1.kattaki arabalar\n");
listele(itr1);
System.out.print("\n");
System.out.print("2.kattaki arabalar\n");
listele(itr2);
System.out.print("\n");
System.out.print("4.kattaki arabalar\n");
listele(itr4);
System.out.print("\n");
System.out.print("5.kattaki arabalar\n");
listele(itr3);
DaireselBaglıListe kat3 = new DaireselBaglıListe(kacinciKat);
DaireselBaglıListe kat6 = new DaireselBaglıListe(kacinciKat+3);
while(sayac1<=30){
kat3.ekle(sayac1);
sayac1++;
}
System.out.println("\n"+kacinciKat+". kattaki arabalar:");
kat3.yazdir();
kacinciKat+=3;
while(sayac2<=30){
kat6.ekle(sayac2);
sayac2++;
}
System.out.println("\n"+kacinciKat+". kattaki arabalar:");
kat6.yazdir();
System.out.println();
System.out.println("----------------------------------------------------------------------------");
int random_sayi=-1;
int problemSayisi=0;
long zaman;
final long baslangic = System.currentTimeMillis();
while(kat1.size()!=0 || kat2.size()!=0 || kat4.size()!=0 || kat5.size()!=0 || kontrol1!=1 || kontrol2!=1){
random_sayi=(int)(Math.random()*6);
switch(random_sayi)
{
case 0:
System.out.println("1. kattaki arabalar");
System.out.println(kat1);
if(kat1.size()==0)
{
System.out.println("Kat bos!\n");
break;
}
if(kat1.size()==1)
{
kalanlar[0]=kat1.peek().toString();
}
System.out.println("Silinen araba:"+kat1.remove());
System.out.println(kat1);
System.out.println();
break;
case 1:
System.out.println("2. kattaki arabalar");
System.out.println(kat2);
if(kat2.size()==0)
{
System.out.println("Kat bos!\n");
break;
}
if(kat2.size()==1)
{
kalanlar[1]=kat2.peek().toString();
}
System.out.println("Silinen araba:"+kat2.pop());
System.out.println(kat2);
System.out.println();
break;
case 2:
if(kat3.bosMu()==1){
System.out.println("Kat bos!\n");
break;
}
if(kat3.doluMu()==false)
{
if(kontrol1==0){
kalanlar[2]=kat3.etkin.toString();
System.out.println("3. kattaki arabalar\n");
System.out.print("3.katta ilk arabadan itibaren her "+n+".araba cikarilmaktadır.\n\n");
System.out.println("3.katta kalan arabalar :");
System.out.println(kat3.etkin);
System.out.println("\n3.katta cikarilan;");
System.out.println(kat3.etkin);
System.out.println("\n3.katta kalanlar;\n");
kontrol1++;
}
else
{
System.out.println("3. kattaki arabalar\n");
System.out.println("Kat bos!\n");
break;
}
}
else{
System.out.println("3. kattaki arabalar");
kat3.cikar(n);
}
System.out.println();
break;
case 3:
System.out.println("4. kattaki arabalar");
System.out.println(kat4);
if(kat4.size()==0)
{
System.out.println("Kat bos!\n");
break;
}
if(kat4.size()==1)
{
kalanlar[3]=kat4.peek().toString();
}
System.out.println("Silinen araba:"+kat4.remove());
System.out.println(kat4);
System.out.println();
break;
case 4:
System.out.println("5. kattaki arabalar");
System.out.println(kat5);
if(kat5.size()==0)
{
System.out.println("Kat bos!\n");
break;
}
if(kat5.size()==1)
{
kalanlar[4]=kat5.peek().toString();
}
System.out.println("Silinen araba:"+kat5.pop());
System.out.println(kat5);
System.out.println();
break;
case 5:
if(kat6.bosMu()==1){
System.out.println("kat bos!");
break;
}
if(kat6.doluMu()==false)
{
if(kontrol2==0){
kalanlar[5]=kat6.etkin.toString();
System.out.println("6. kattaki arabalar\n");
System.out.print("6.katta ilk arabadan itibaren her "+n+".araba cikarilmaktadır.\n\n");
System.out.println("6.katta kalan arabalar :");
System.out.println(kat6.etkin);
System.out.println("\n6.katta cikarilan;");
System.out.println(kat6.etkin);
System.out.println("\n6.katta kalanlar;\n");
kontrol2++;
}
else
{
System.out.println("6. kattaki arabalar\n");
System.out.println("Kat bos!\n");
break;
}
}
else {
System.out.println("6. kattaki arabalar");
kat6.cikar(n);
}
System.out.println();
break;
}
problemSayisi++; // While'in kac kez dondugunu gormek icin kullandigimiz degisken.
}
final long bitis = System.currentTimeMillis(); //islem bitince sistem saatine bakildi.
zaman=bitis-baslangic; // Aradaki zaman farki bulundu.
if(zaman==0){
System.out.println("Problemin cozum suresi, sistem saatinin algilayabilecegi kadar buyuk degil.");
}
else{
System.out.println("----------------------------------------------------------------------------");
System.out.println("\n\n"+problemSayisi+" kere while dongusune girildi.");
System.out.println("1 adet problem yaklasik "+zaman+" milisaniyede cozuldu.");
System.out.println("3 saniyede cozulebilecek otopark problemi sayisi = "+(long)3000/zaman);
}
System.out.println("1.kattan son cikarilan araba: " +kalanlar[0]);
System.out.println("2.kattan son cikarilan araba: " +kalanlar[1]);
System.out.println("3.kattan son cikarilan araba: " +kalanlar[2]);
System.out.println("4.kattan son cikarilan araba: " +kalanlar[3]);
System.out.println("5.kattan son cikarilan araba: " +kalanlar[4]);
System.out.println("6.kattan son cikarilan araba: " +kalanlar[5]);
}
public static void listele(Iterator<Araba> itr1)
{
System.out.print("Arabaların renkleri:");
while(itr1.hasNext())
{
Araba iteratorValue=itr1.next();
System.out.print(iteratorValue+" ");
}
}
}