inf202: struktur data antrian (queue -...

Post on 18-Apr-2019

262 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Pertemuan 11:

INF202: Struktur Data

ANTRIAN (QUEUE)

Dosen: Wayan Suparta, PhD

Introduction to Queue

• Proses antrian merupakan suatu proses yang berhubungan

dengan kedatangan pelanggan pada

suatu fasilitas pelayanan

menunggu pelayanan

dilayani dan

akhirnya meninggalkan fasilitas tersebut sesudah dilayani.

• Prinsip Antrean : FIFO (First In First Out), atau

FCFS (First Come First Serve) “Yang Tiba lebih awal Maka akan dilayani Terlebih Dahulu”

• Berisi operasi penyisipan (Insertion) hanya diperbolehkan

pada salah satu sisi, yang disebut sisi Belakang (Rear) dan

operasi penghapusan (Deletion) hanya diperbolehkan pada

sisi lainnya yang disebut sisi Depan (Front) dari List.

Logika Antrian

• Pengantri register dulu

• Setelah register pengantri

pertama dapat tempat

paling depan

• Pengantri selanjutnya

berada dibelakangnya

• Setelah proses pengantri

pertama selesai, antrian

setelahnya maju

• Sehingga terdapat tempat

kosong (paling belakang)

untuk pengantri baru

OPERASI DASAR PADA ANTREAN

Ada 4 operasi dasar yang dapat dilakukan pada Struktur Data

Antrean, yaitu :

1. CREATE(Antrean)

2. ISEMPTY(Antrean)

3. INSERT(Elemen,Antrean)

4. REMOVE(Antrean)

Pandang misalnya Antrean Q = [ Q1 , Q2 , .., QNOEL ],

maka

1. CREATE(Antrean)

Adalah suatu operator untuk membentuk dan menunjukan

suatu Antrean Hampa Q.

Berarti : NOEL(CREATE(Q) = 0

FRONT(CREATE(Q)) = tidak terdefinisi

REAR(CREATE(Q)) = tidak terdefinisi

2. ISEMPTY(Antrean)

Adalah operator yang menentukan apakah Antrean Q hampa atau

tidak. Operand dari operator ini merupakan Antrean, sedangkan

hasilnya merupakan Type data Boolean.

ISEMPTY(Q) = True, jika Q hampa, yaitu jika NOEL(Q)=0

False, jika Q tidak hampa, yaitu jika NOEL(Q) <> 0

Maka ISEMPTY(CREATE(Q)) = True.

3. INSERT(Elemen,Antrean)

Operator yang menginsert (mengisi) elemen E kedalam

Antrean Q. Elemen E ditempatkan dibagian depan dari

Antrean. Hasil dari Operasi ini adalah Antrean yang lebih

panjang.

4. REMOVE(Antrean) / DELETE(Antrean) REMOVE(Q) adalah operator yang menghapus elemen bagian

depan dari Antrean Q. Hasilnya merupakan Antrean yang lebih

pendek. Pada setiap operasi ini, harga dari NOEL(Q)

berkurang satu, dan elemen kedua dari Q menjadi elemen

terdepan. Jika NOEL(Q) = 0 , maka REMOVE(Q)

memberikan suatu kondisi Error, yaitu Underflow. Jelas bahwa

REMOVE(CREATE(Q)) juga memberikan kondisi Error

Underflow.

Langkah :

- Memastikan bahwa antrean ada isinya.

- Menggeser Front, maju satu langkah

- Mengcopy isi elemen yang ditunjuk Front ke

variabel data.

Metode Antrian:

1. ANTREAN LINEAR

Menggunakan 2 pointer (indikator) :

- Front (F) untuk awal antrean

- Rear (R) untuk akhir antrean

Untuk pengambilan data menggunakan pointer Front (F),

sedangkan pemasukan data menggunakan pointer Rear (R).

Syarat : Front (selalu) <= Rear

Deklarasi Array 1 dimensi untuk Queue :

Var Q : Array[1..N] of Type Data;

Contoh Queue (Antrian) Linear

Front Rear

Queue (Antrian)

Front Rear

Queue (Antrian)

Front Rear

Queue (Antrian)

Front Rear

Queue (Antrian)

Front Rear

Queue (Antrian)

Front Rear

Beberapa keadaan pada Antrean Linear.

2. ANTREAN MELINGKAR (CIRCULAR QUEUE)

Prinsip : FIFO (First In First Out)

Aturan Circular Array

1. Proses penghapusan dilakukan dengan cara nilai depan

(front) ditambah 1 depan=depan + 1.

2. Proses penambahan elemen sama dengan queue linear

array yaitu nilai belakang ditambah 1

belakang=belakang + 1.

3. Jika depan = maks dan ada elemen yang akan dihapus,

maka nilai depan = 1.

4. Jika belakang = maks dan depan <> 1 maka jika ada

elemen yang akan ditambahkan, nilai belakang=1.

5. Jika hanya tinggal 1 elemen di queue (depan =

belakang), dan akan dihapus maka depan diisi 0 dan

belakang diisi dengan 0 (queue kosong).

Circular Array

Proses Circular Array

Proses Circular Array

Terlihat dari urutan proses diatas, nilai F dapat lebih kecil atau

lebih besar dari R, dimana ini merupakan hal yang tidak

dapat terjadi di antrean linear (linear queue)

Oleh karena itu agar Antrean dapat digunakan secara Maximal

harus diwujudkan dalam bentuk antrean melingkar (Circular

Queue).

Contoh 1: Algoritma Program Antrian

1. Preprocessor dan Header File

#include <iostream>

#define MAX 20 //maksimum data queue

using namespace std;

2. Struct data

//Deklarasi struct antrian

struct Queue

{ int front, rear, data[MAX];

}Q;

3. Memeriksa antrian

//cek apakah antrian penuh

bool isFull() {

return Q.rear == MAX; } //cek apakah antrian kosong bool

isEmpty() {

return Q.rear == 0;

}

Algoritma Program Antrian ……

4. Menampilkan Antrian //Menampilkan Queue

void printQueue() {

if (isEmpty())

{

cout << "Antrian kosong"<<endl;

}

else {

cout << "QUEUE : ";

for (int i = Q.front; i < Q.rear; i++) //menambahkan

koma jika data tidak terdapat di antrian pertama

cout << Q.data[i] << ((Q.rear-1 == i) ? "" : ",");

cout << endl;

}

}

5. Input Data Antrian

6. Mengambil Data Antrian

7. Menampilkan Menu

LATIHAN 17 A. Modifkasi program pada Contoh 1 di atas dengan tampilan:

Inputnya serentak (tidak satu per satu)

Buat VIEW data yang diinput dan data yang dihapus

Tampilkan data antrian serentak

Menu: (1). Enqueue, (2) Dequeue, (3) View, (4) EXIT

B. Buat program antrian teller bank dengan maksimum antrian

500 dalam sehari.

C. Buat program antrian Servis Motor dengan input adalah

nomer polisi sebanyak 15 motor.

Contoh 2: Program Antrian

#include <iostream> #include <conio.h> #include <stdlib.h> #include <windows.h> using namespace std; char pil; int jml; void delay(); struct node { char kar; node *next; }; node *tail; //ekor node *now; node *head;

void clrscr() { system("cls"); } void gotoxy(int x, int y) { HANDLE hConsoleOutput; COORD dwCursorPosition; cout.flush(); dwCursorPosition.X = x; dwCursorPosition.Y = y; hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hConsoleOutput,dwCursorPosition); }

Contoh 2: sambungan if(i!=75-jml*6) { gotoxy(i+1,20);cout<<" "; gotoxy(i,21);cout<<" "; gotoxy(i+1,22);cout<<" "; } } } void dequeue() { if(head==NULL) { gotoxy(1,8); cout<<"antrean kosong !"; delay(); } else {

jml=jml-1; char delete_element=head->kar; node *temp; temp=head; head=head->next; delete temp; for(int i=69;i<=76;i++) { gotoxy(i+1,20); cout<<" O"; gotoxy(i,21); cout<<"=("<<delete_element<<")="; gotoxy(i+1,22); cout<<"| |"; delay(); gotoxy(i+1,20); cout<<" "; gotoxy(i,21); cout<<" "; gotoxy(i+1,22); cout<<" "; }

Contoh 2: sambungan void buatnodebaru()

{

tail=NULL;

head=NULL;

}

void push(char ch)

{

now=new node;

if(head==NULL)

{

now->kar=ch;

now->next=NULL;

tail=now;

head=now;

}

else

{

now->kar=ch;

now->next=NULL;

tail->next = now;

tail=now;

}

}

void enqueue() { int i; char temp; gotoxy(1,6); cout<<" "; gotoxy(1,8); cout<<" "; gotoxy(1,6); cout<<"masukkan @ karakter : "; cin>>temp; gotoxy(1,6); cout<<" "; push(temp); for(i=1;i<= 75-jml*6;i++) { gotoxy(i+1,20);cout<<" O"; gotoxy(i,21); cout<<"=("<<now->kar<<")="; gotoxy(i+1,22);cout<<"| |"; delay();

Contoh 2: sambungan int byk=0;

while(byk!=jml)

{

byk=byk+1;

for(int i=69-byk*6;i<=75-

byk*6;i++)

{

gotoxy(i+1,20); cout<<" O";

gotoxy(i,21); cout<<"=("<<head-

>kar<<")=";

gotoxy(i+1,22); cout<<"| |";

delay();

if(i!=75-byk*6)

{

gotoxy(i+1,20); cout<<" ";

gotoxy(i,21); cout<<" ";

gotoxy(i+1,22); cout<<" ";

}

}

}

}

}

void input() { gotoxy(1,1);cout<<"1.Enqueue"; gotoxy(1,2);cout<<"2.Dequeue"; gotoxy(1,3);cout<<"3.Exit"; do { gotoxy(1,4);cout<<"masukkan pilihan anda[1/2/3] : "; gotoxy(32,4);cin>>pil; gotoxy(32,4);cout<<" "; switch(pil) { case '1': { if(jml<10) { jml=jml+1; enqueue(); }

Contoh 3: sambungan else

{

gotoxy(1,8); cout<<"antrean penuh !";

delay();

gotoxy(1,8); cout<<" ";

}

break;

}

case '2':

{

dequeue();

break;

}

case '3':

{

exit(1);

break;

}

}

}while(1);

}

int main() { buatnodebaru(); jml=0; clrscr(); input(); getch(); } void delay() { for(int y=1;y<100;y++) for(int x=1;x<100;x++) for(int p=1;p<100;p++) cout<<""; }

Contoh 3: Program Queue #include <iostream>

#include <sstream>

#include <string>

#include <stdlib.h>

using namespace std;

const int MAX_ANTRIAN = 5;

struct orang

{

string nama;

int umur;

};

void buatAntrian(); // mengisi antrian kosong sebanyak MAX_ANTRIAN dengan variabel

kontrol

void tampilkanMenu(); // menampilkan menu yang ada

void eksekusiPilihan(); // mengambil pilihan dari user dan eksekusi pilihan tersebut

void tambahAntrian(); // menambah antrian paling belakang

void kurangiAntrian(); // mengurangi antrian paling depan dan menampilkan orang yang

keluar dari antrian

void printAntrian(); // menampilkan seluruh antrian yang ada

void printOrang(); // menampilkan data satu orang saja

Contoh 3: sambungan

//inisisalisasi variabel yang akan dipakai

orang antrian[MAX_ANTRIAN];

int pil, pripil, antri;

bool isEmpty = true; // penanda apakah antrian sedang kosong

bool isFull = false; // penanda apakah antrian sudah penuh

bool isOver = false; // penanda bahwa program selesai atau tidak

/* ================== MAIN PROGRAM ===================*/

int main()

{

buatAntrian();

while(!isOver)

{

tampilkanMenu();

eksekusiPilihan();

}

system("pause");

return 0;

}

Contoh 3: sambungan /* ============== END OF MAIN PROGRAM ================*/

//mengisi data awal dari antrian

void buatAntrian()

{

int i;

for(i=0; i<MAX_ANTRIAN; i++)

{

antrian[i].nama = "null"; // antrian dikatakan kosong apabila nama = null

antrian[i].umur = -1; // dan umur = -1

}

}

//menampilkan menu utama

void tampilkanMenu()

{

system("cls");

cout << "(1) tambah antrian" << endl;

cout << "(2) kurangi antrian" << endl;

cout << "(3) print antrian" << endl;

cout << "(4) keluar dari program" << endl;

cout << "masukkan pilihan anda: ";

cin >> pil; //kesatu

}

Contoh 3: sambungan //pemrosesan pilihan dari menu utama

void eksekusiPilihan()

{

if (pil == 1) {

tambahAntrian(); }

else if (pil == 2) {

kurangiAntrian(); }

else if (pil == 3)

{

//pada pilihan ini ditambahkan submenu print semua atau satu saja

cout << "(1) print semua antrian" << endl;

cout << "(2) print satu antrian" << endl;

cout << "pilihan : ";

cin >> pripil;

if (pripil == 1) {

printAntrian(); }

else if (pripil == 2) {

printOrang(); }

}

else if (pil == 4)

{

isOver = true;

}

}

Contoh 3: sambungan //prosedur untuk penambahan data antrian

void tambahAntrian()

{

//diatur perulangan untuk memeriksa apakah ada antrian yang kosong

int i;

for(i=0; i<MAX_ANTRIAN; i++)

{

//jika ada antrian yang kosong, maka data bisa dimasukkan

if(antrian[i].nama == "null" && antrian[i].umur == -1)

{

cout << "antrian ke-" << i+1 << " > " << endl;

cout << "masukkan nama: ";

cin >> antrian[i].nama;

cout << "masukkan umur: ";

cin >> antrian[i].umur;

break; }

//jika tidak ada yang kosong, maka tampilkan antrian penuh

else {

if (i == MAX_ANTRIAN-1) {

cout << "antrian penuh" << endl; }

}

}

system("pause"); }

Contoh 3: sambungan //prosedur untuk mengurangi pengantri pertama, lalu antrian setelahnya maju.

void kurangiAntrian()

{

int i;

//tampilkan data yang akan dihapus

cout << "antrian ke-1 telah dihapus" << endl;

cout << "nama: " << antrian[0].nama << endl;

cout << "umur: " << antrian[0].umur << endl;

//hapus data dengan mengisi "null" dan -1

antrian[0].nama = "null";

antrian[0].umur = -1;

//menggeser antrian ke atas

for(i=0; i<MAX_ANTRIAN-1; i++)

{

antrian[i].nama = antrian[i+1].nama;

antrian[i].umur = antrian[i+1].umur;

}

//mengisi antrian terakhir dengan data kosong

antrian[MAX_ANTRIAN-1].nama = "null";

antrian[MAX_ANTRIAN-1].umur = -1;

system("pause");

}

Contoh 3: sambungan

//prosedur menampilkan data semua antrian

void printAntrian()

{

int i;

for(i=0; i<MAX_ANTRIAN; i++)

{

cout << "antrian ke-" << i+1 << " > " << endl;

if(antrian[i].nama == "null" && antrian[i].umur == -1)

{

cout << "KOSONG" << endl;

}

else

{

cout << "nama: " << antrian[i].nama << endl;

cout << "umur: " << antrian[i].umur << endl;

}

}

system("pause");

}

Contoh 3: sambungan

//prosedur untuk menampilkan data antrian perorang

void printOrang()

{

cout << "antrian ke: ";

cin >> antri;

if(antrian[antri].nama == "null" && antrian[antri].umur == -1)

{

cout << "KOSONG" << endl;

}

else

{

cout << "nama: " << antrian[antri-1].nama << endl;

cout << "umur: " << antrian[antri-1].umur << endl;

}

system("pause");

}

Contoh 4: Tambah dan Hapus Antrian

//Tambah dan hapus antrian

#include <iostream>

#include <conio.h>

#include <stdlib.h>

#include <windows.h>

using namespace std;

main()

{

int cek=0,data[20],x,hapus;

char pil;

do{

cout<<"1. Tambah Antrian"<<endl;

cout<<"2. Hapus Antrian"<<endl;

cout<<"3. Lihat Antrian"<<endl;

cout<<"4.Keluar"<<endl;

cout<<endl;

cout<<"silahkan masukkan pilihan anda=";

pil=getche();

cout<<endl;

if(pil!='1'&&pil!='2'&&pil!='3'&&pil!='4')

cout<<"anda salah mengetikan inputan";

else

{

if(pil=='1')

{

if(cek==20)

cout<<"antrian penuh";

else

{

cout<<"masukkan nilai=";

cin>>x;

data[cek]=x;

cek++;

}

}

Contoh 4: sambungan else {

if(pil=='2')

{

if(cek==0)

cout<<"antrian kosong";

else

{

hapus=data[0];

for(int v=0;v<cek;v++)

data[v]=data[v+1];

data[cek-1]=NULL;

cek--;

cout<<"data dengan

nilai"<<hapus<<"terhapus";

}

getch();

}

else

{

if(pil=='3')

{

if(cek==0)

cout<<"antrian kosong";

else

{

cout<<endl;

for(int z=0;z<cek;z++)

{

cout<<"|";

cout<<" "<<data[z];

cout<<"|";

}

}

getch();

}

}

}

}

}while(pil!='4');

}

top related