inf202: struktur data antrian (queue -...
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');
}