Jumat, 18 November 2016

ADT QUEUE

Program java untuk antrian di supermarket. ADT QUEUE, FIFO (First In First Out).


Suatu supermarket mempunyai 2 buah Teller pembayaran, dan pengunjung mengantri di depan setiap Teller untuk membayar (antrian maksimal per teller 10 orang). Jika antrian di salah satu teller jumlahnya lebih banyak dari teller yang lain, maka akan dilakukan “jockeying” yaitu orang paling belakang pindah antrian (dari Teller yang jumlah antriannya banyak ke teller yang antriannya lebih sedikit hingga beda panjang kedua antrian maksimal 1 orang). Buatlah program yang mensimulasikan kasus diatas. Ilustrasi program bisa dilihat pada gambar dibawah.



Queue.java

package supermarket;
import java.util.Scanner;

/**
*
* @author Joy
*/

class Node {

Object data;
Node next;

Node(Object object) {
data = object;
}
}

public class Queue {

private Node nodeAwal;
private Node nodeAkhir;
public String nama;
private int size = 0;
private int maxSize = 10;
private boolean penuh = true;

public Queue(String namaList) {
nama = namaList;
nodeAwal = nodeAkhir = null;
}

public boolean getStatus() {
return penuh;
}

public boolean kosong() {
return nodeAwal == null;
}

public boolean penuh() {
return size == maxSize;
}

public int getSize() {
return size;
}

public void enqueue(Object object) {
if (penuh()) {
return;
}

Node baru = new Node(object);
if (kosong()) {
nodeAkhir = baru;
} else {
baru.next = nodeAwal;
}
nodeAwal = baru;
size++;

System.out.println("" + baru.data + " telah masuk antrian "+ nama);
}

public void jockeying(Queue antrian) {
Node lastIn = nodeAwal;
antrian.enqueue(lastIn.data);
nodeAwal = lastIn.next;
size--;
System.out.println("" + lastIn.data + " dipindah dari " + nama + " ke " + antrian.nama);
}

public Object dequeue() {
if (kosong()) {
return null;
}
Object object = nodeAkhir.data;
Node cari = nodeAwal;
if (nodeAwal == nodeAkhir) {
nodeAwal = nodeAkhir = null;
}
while (cari != null) {
if (cari.next == nodeAkhir) {
nodeAkhir = cari;
cari.next = null;
break;
}

cari = cari.next;
}
size--;

System.out.println("" + object + " telah dilayani dari "+nama);
return object;
}

public void cetak() {
Node cari = nodeAwal;
int counter = size + 1;
System.out.print("" + this.nama + " : ");
if (cari != null) {
counter--;
System.out.println("" + counter + ". " + cari.data);
while (cari != null) {
if (cari == nodeAwal) {
cari = cari.next;
continue;
}
counter--;
System.out.println(" " + counter + ". " + cari.data);
cari = cari.next;
}
}
if (kosong()) {
System.out.println("");
}
}
}




Supermarket.java

package supermarket;
import java.util.Scanner;

/**
*
* @author Joy
*/

public class Supermarket {

static Queue teller1 = new Queue("Teller 1");
static Queue teller2 = new Queue("Teller 2");

static Queue tellers[] = new Queue[2];

static Scanner input = new Scanner(System.in);

public static void main(String[] args) {

tellers[0] = teller1;
tellers[1] = teller2;

boolean operasi = true;

cetakPetunjuk();

do {
String inputData;
System.out.print("Masukkan input : ");
inputData = input.next();
switch (inputData) {
case "input()":
inputAntrian();
break;
case "cetak()":
teller1.cetak();
teller2.cetak();
break;
case "layani(1)":
layani(1);
break;
case "layani(2)":
layani(2);
break;
case "help()":
cetakPetunjuk();
break;
case "quit()":
operasi = false;
break;
default:
System.out.println("Input tidak ada dalam menu.");
}
} while (operasi);
}

public static void cetakPetunjuk() {
System.out.println("Ketik : \n"
+ "- help() (mencetak daftar petunjuk)\n"
+ "- cetak() (untuk mencetak data pada semua antrian)\n"
+ "- input() (untuk menambah antrian)\n"
+ "- layani(_no) (ganti '_no' dengan 1 atau 2 untuk melayani antrian)\n"
+ "- quit() (untuk keluar dari program\n");
}

public static void layani(int i) {
if (i == 1) {
if (teller1.getSize() > 0) {
teller1.dequeue().toString();
} else {
System.out.println("Tidak antrian di-" + teller1.nama);
}
} else if (i == 2) {
if (teller2.getSize() > 0) {
teller2.dequeue().toString();
} else {
System.out.println("Tidak antrian di-" + teller2.nama);
}
}

if (Math.abs(teller1.getSize() - teller2.getSize()) > 1) {
if (teller1.getSize() > teller2.getSize()) {
teller1.jockeying(teller2);
} else {
teller2.jockeying(teller1);
}
}
}

public static void inputAntrian() {
String nama;
System.out.print("Masukkan nama : ");
nama = input.next();
boolean ok = false;
for (int i = 0; i < tellers.length; i++) { if (!sortedTeller(tellers)[i].penuh()) { sortedTeller(tellers)[i].enqueue(nama); ok = true; break; } } if (!ok) { System.out.println("Maaf semua Teller penuh"); } } public static Queue[] sortedTeller(Queue[] tellerList) { Queue[] teller = tellerList; for (int i = 0; i < teller.length; i++) { for (int j = i; j < teller.length - 1; j++) { if (teller[j].getSize() > teller[j + 1].getSize()) {
Queue temp = teller[j];
teller[j] = teller[j + 1];
teller[j + 1] = temp;
}
}
}
return teller;
}
}

Tidak ada komentar:

Posting Komentar