Anda di halaman 1dari 30

LAPORAN PRAKTIKUM ALGORITMA DAN STRUKTUR DATA QUEUE

Disusun Oleh : Nama NIM Prodi : Fauzul Adhim : 110533430541 : S1 PTI off B 2011

UNIVERSITAS NEGERI MALANG FAKULTAS TEKNIK S1 PENDIDIKAN TEKNIK INFORMATIKA

2012
BAB IV QUEUE

A. Tujuan 1. 2. 3. Mahasiswa mampu menjelaskan pengertian queue dan dequeue Mahasiswa mampu menjelaskan dan menunjukkan cara pembuatan queue, Mahasiswa mampu menjelaskan dan menunjukkan program dengan ADT

operasi push dan pop pada array (Abstract Data Type) queue dan dequeue dengan array B. Dasar Teori Queue / Antrian adalah suatu kumpulan data yang mana penambahan elemen hanya bisa dilakukan pada satu ujung (disebut dengan sisi belakang atau rear) dan penghapusan atau pengambilan elemen dilakukan lewat ujung lain (disebut dengan sisi depan atau front). Antrian menggunakan prinsip Pertama Masuk Pertama Keluar First In First Out (FIFO). Dengan kata lain urutan masuk sama dengan urutan keluar. Antrian banyak dijumpai dalam kehidupan sehari-hari. Mobil-mobil yang mengantri digerbang tol untuk membeli karcis tol; orang-orang yang mengantri di loket untuk membeli karcis film juga membentuk antrian. Pada antrian kita tidak menentukan batasan seberapa banyak antrian itu akan berakhir tapi jika kita menggunakan array untuk mengimplementasikan queue/ tumpukan kita harus membatasi jumlah antrian yang dapat masuk. Ini dikarenakan array memiliki batasan (upperbound) yang menjadi penghambat jika kita menggunakan antrian. Oleh sebab itu kita akan mengimplementasikan antrian ini dengan menggunakan link list. Dengan menggunakan link list tepatnya Single Link List maka elemen dapat dimasukkan secara tidak terbatas. Kita menggunakan Header Single Link List yang seperti Stack ada posisi Header dapat kita pergunakan untuk menyimpan informasi mengenai banyaknya elemen dalam Queue.

a. Deklarasi Queue Dalam Link List Pendeklarasian Queue di dalam link list sama seperti kita mendeklarasikan link list. Menggunakan pointer sebagai variabel yang menunjuk ke elemen antrian selanjutnya. b. Operasi Dasar Pada Queue Ada 6 operasi dasar yang dapat dilakukan pada struktur data antrian, yaitu: 1. CREATE(Q) Untuk menciptakan dan menginisialisasi Queue dengan cara membuat Head = -1 dan Tail = -1 2. SEMPTY(Q) ISEMPTY(Q) adalah operator yang menentukan apakah antrian Q hampa atau tidak. ISEMPTY(Q) di terapkan di dalam pascal menjadi sebuah function yang bertipe boolean sehingga hasil dari function ini akan bernilai True jika antrian dalam keadaan kosong / hampa (NOEL(Q) = 0) dan akan bernilai False jika antrian dalam keadaan terisi / tidak kosong (NOEL(Q) > 0). Untuk memeriksa apakah Antrian sudah penuh atau belum Dengan cara memeriksa nilai Tail, jika Tail = -1 maka empty 3. Enqueue() Digunakan Untuk menambahkan elemen ke dalam Antrian, penambahan elemen selalu ditambahkan di elemen paling belakang, Penambahan elemen selalu menggerakan variabel Tail dengan cara increment counter Tail terlebih dahulu 4. Dequeue() Digunakan untuk menghapus elemen terdepan/pertama (head) dari Antrian Dengan cara menggeser semua elemen antrian kedepan dan mengurangi Tail dgn 1, Penggeseran dilakukan dengan menggunakan looping. 5. Clear() Digunakan Untuk menghapus elemen-elemen Antrian dengan cara membuat Tail dan Head = -1, Penghapusan elemen-elemen Antrian sebenarnya tidak menghapus arraynya, namun hanya mengeset indeks pengaksesannya ke nilai -1 sehingga elemen-elemen Antrian tidak lagi terbaca 6. Tampil() Digunakan Untuk menampilkan nilai-nilai elemen Antrian dengan Menggunakan looping dari head s/d tail

c. Jenis-jenis Antrian Selain antrian yang telah kita bahas di atas, masih ada dua tipe antrian lagi yang penggunaannya juga banyak di dalam kehidupan sehari hari atau dalam dunia komputer itu sendiri, diantaranya adalah : 1. DEQUE DEQUE adalah antrian dimana elemennya bisa masuk dan keluar lewat kedua ujungnya (berbeda dengan queue yang hany bisa masuk lewat ujung belakang dan keluar lewat ujung depan). Biasanya DEQUE disajikan dengan menggunakan Double link list yang memiliki dua buah pointer yang menunjuk ke posisi sebelumnya dan sesudahnya. Berikut ini adalah struktur umum dari Deque

DEQUE juga mempunyai dua jenis variasi yaitu : 1. Deque input terbatas : suatu deque yang membatasi pemasukkan elemen hanya pada satu ujung dari list, sementara penghapusan elemen boleh dilakukan pada kedua ujung list.
2. Deque output terbatas : merupakan kebalikan dari deque input terbatas yaitu

suatu deque yang membatasi penghapusan elemen hanya pada satu ujung dari list, sementara pemasukkan elemen boleh dilakukan pada kedua ujung list. 2. ANTRIAN BERPRIORITAS Antrian berprioritas adalah suatu queue yang setiap elemennya telah diberikan sebuah prioritas, dan urutan proses penghapusan elemen adalah berdasarkan aturan berikut :
a. Elemen yang prioritasnya lebih tinggi, diproses lebih dahulu dibandingkan

dengan elemen yang prioritas lebih rendah.


b. Dua elemen dengan prioritas yang sama, diproses sesuai dengan urutan mereka

sewaktu dimasukkan ke dalam priority queue. Salah satu contoh antrian berprioritas ini adalah sistem berbagi waktu (time sharing system), dimana program yang mempunyai prioritas tinggi akan dikerjakan lebih dahulu dan program-program yang berprioritas sama akan membentuk antrian yang biasa.

C. Latihan
1. Latihan 1

Script Program

#include <iostream.h> #include <conio.h> \ int f,r,df; int Antrian[50]; void enQueue (void); void deQueue (void) ; void Tampilkan (void); void main () { int k; for (k=0;k<50;k++) Antrian[k]=0; while (1) { clrscr(); cout<<endl; cout<<" +++++Pilihan++++++"<<endl; cout<<" 1. enQueue"<<endl; cout<<" 2. deQueue"<<endl; cout<<" 3. Tampilkan queue"<<endl; cout<<" 4. Keluar"<<endl; cout<<" ++++++++++++++++++"<<endl; cout<<endl; cout<<"Masukan pilihan (1,2,3,4) dalam melakukan Queue : "; cin>>k; if (k==1) enQueue (); if (k==2) deQueue (); if (k==3) Tampilkan (); if (k==4) break; } } void enQueue () { cout<<" Masukan elemen : "; cin>>Antrian[r]; r++; } void deQueue() { Antrian[f]=0; f++; } void Tampilkan () { int i; cout<<endl<<"Queue : "<<endl; for(i=f;i<r;++i) cout<<Antrian[i]<<",";

cout<<endl<<"press any key..."; getche (); }

Hasil
1. Jika memilih satu maka akan disuruh untuk memasukkan nilai dari antrian

yang di inginkan.

Antrian tersebut dapat diisi trus menerus sampai dengan batas yang telah ditentukan oleh pemrogam,

2. Nomer 3 adalah untuk menampilkan hasil inputan antrian yang telah dimasukkan mulai dari awal masukkan (kiri) sampai dengan masukkan yang terakhir (kanan).

3. nomer 3 adalah digunakan untuk menghapus elemen terdepan atau pertama dari antrian, disini adalah nomer 1 akan hilang

4. setalah memilih nomer 2, kita lihat hasilnya pada nomer 3 lagi untuk

menampilkan

5. tekan 4 untuk keluar dari program

2. latihan 2 Script Program

#include <stdio.h> #include <conio.h> #define max 8 typedef struct { int data[max]; int head; int tail; } queue; queue antrian; void create() { antrian.head=antrian.tail=-1; } int isempty() { if (antrian.tail==-1) return 1; else return 0; } int isfull() { if (antrian.tail==max-1) return 1; else return 0;4; } void Enqueue(int data) { if (isempty()==1) { antrian.head=antrian.tail=0; antrian.data[antrian.tail]=data; printf(" %d Masuk! \n", antrian.data[antrian.tail]) ; } else if (isfull()==0) { antrian.tail++; antrian.data[antrian.tail]=data; printf(" %d Masuk! \n", antrian.data[antrian.tail]); } } int dequeue() { int i; int e = antrian.data[antrian.head]; for (i=antrian.head;i<=antrian.tail-1;i++) { antrian.data[i]=antrian.data[i+1]; } antrian.tail--; return e; }

void Tampil() { if (isempty()==0) { for (int i=antrian.head;i<=antrian.tail;i++) { printf(" %d ",antrian.data[i]); } } else printf(" Data Kosong \n");

void main() { int pil; int data; create(); do { clrscr(); printf(" ================================== \n"); printf(" PROGRAM ANTRIAN \n"); printf(" ================================== \n"); printf(" 1. Enqueue ( masukkan data )\n"); printf(" 2. Dequeue ( keluarkan data awal )\n"); printf(" 3. Tampil ( menampilkan data )\n"); printf(" 4. Exit\n"); printf(" ================================== \n\n"); printf(" Pilihan = ");scanf("%d", &pil); switch(pil) { case 1: printf(" Data = "); scanf("%d",&data); printf(" \n"); Enqueue(data); break; case 2: printf(" Elemen yang keluar = %d",dequeue()); printf(" \n"); break; case 3: printf("\n"); Tampil(); printf("\n"); break; } getch();

} while(pil!=4);

Hasil

1. Jika memilih satu maka akan disuruh untuk memasukkan nilai dari antrian

yang di inginkan.

Antrian tersebut dapat diisi trus menerus sampai dengan batas yang telah ditentukan oleh pemrogam,

2. Nomer 3 adalah untuk menampilkan hasil inputan antrian yang telah dimasukkan mulai dari awal masukkan (kiri) sampai dengan masukkan yang terakhir (kanan).

3. nomer 3 adalah digunakan untuk menghapus elemen terdepan atau pertama dari antrian, disini adalah nomer 1 akan hilang

4. setalah memilih nomer 2, kita lihat hasilnya pada nomer 3 lagi untuk menampilkan

5. tekan 4 untuk keluar dari program

D. Tugas Pratikum

Script Program

# include <stdio.h> # include <conio.h> # include <stdlib.h> # include <string.h> # define QSIZE 5 typedef struct { int count; int head,tail; char names[QSIZE][30]; }QUEUE; char* enqueue(char *); char* dequeue(); void display(); void init(); QUEUE *pq; int main() { int choice; char str[30]; QUEUE q; pq=&q; init(); do { clrscr(); printf("================================\n"); printf("|| Tugas Pratikum QUEUE ||\n"); printf("================================\n"); printf(":1 for Add into the Queue.. \n"); printf(":2 for Delete from the Queue.. \n"); printf(":3 Display Elements of the Queue..\n"); printf(":4 For Exit..\n"); printf("================================\n"); printf("\tEnter your Choice: "); scanf("%d",&choice); printf("================================\n"); switch(choice) { case 1: printf("\n\t Enter a Name: "); fflush(stdin); gets(str); puts(enqueue(str)); break; case 2: puts(dequeue()); break; case 3: display(); break; case 4: exit(0); default:

printf("\n\n Plz press 1,2,3 or 4 key.."); } printf("\n\n\n Press Any Key to continue..."); fflush(stdin); while(!kbhit()); } while(1); return 0; } void init() { pq->head = pq->tail = pq->count= 0; } char* enqueue(char *p) { if(pq->count==QSIZE) return "\n\n Error: Queue Overflow..!!"; pq->tail= (pq->tail)%QSIZE; strcpy(pq->names[(pq->tail)++],p); pq->count++; return "\n\n Element Successfully Inserted"; } char* dequeue() { if(pq->count==0) return "\n\n\ Error: Queue Underflow..!!"; pq->head= (pq->head)%QSIZE; pq->count--; printf("\n\n Deleted Queue Element is :"); return pq->names[(pq->head)++]; } void display() { int i=pq->head; int x=0; if(pq->count==0) printf("\n\n Queue is Empty.."); else { while(x<pq->count) { if(i==QSIZE) i%=QSIZE; printf("\n :%s",pq->names[i]); i++; x++; } } }

Hasil

1. Tampilan awal program

2. Option 1 untuk memasukkan data

3. Jika ada 5 masukkan, maka antrian akan penuh dan tidak bisa ditambah antrian lagi

4. Jika ingin menambah antrian, maka harus mengeluarkan antrian paling luar dengan memilih nomer 2

5. Untuk lebih jelas lihat daftar antrian dengan plihan nomer 3

6. Dengan begitu bisa menambah lagi daftar antrian

7. Dan bisa di lihat lagi hasilnya apakah sudah masuk atau tidak

8. Jika ingin mengakhiri program tekan nomer 4

E. Tugas Rumah 1. Tugas rumah 1 Modifikasi program di Tugas Praktikum dengan menambahkan menu untuk mereset antrian
# # # # # include include include include include

Script Program

<stdio.h> <conio.h> <stdlib.h> <string.h> <iostream.h>

# define QSIZE 5 typedef struct { int count; int head,tail; char names[QSIZE][30];

} QUEUE; char* enqueue(char *); char* dequeue(); void display(); void init(); QUEUE *pq; int main() { char str[30],choice; QUEUE q; pq=&q; init(); do { clrscr(); printf("================================\n"); printf("|| Tugas Rumah QUEUE ||\n"); printf("================================\n"); printf("\n 1. Menambah antrian"); printf("\n 2. Menghapus 1 data antrian"); printf("\n 3. Menampilkan antrian"); printf("\n 4. Mengahpus Seluruh Antrian (reset)"); printf("\n 5. Keluar program\n"); printf("\n==============================\n"); printf("\n Masukkan Pilihan : "); scanf("%s",&choice); printf("\n==============================\n"); switch(choice) { case '1': printf("\n Masukkan antrian: "); fflush(stdin); gets(str); puts(enqueue(str)); break; case '2': printf("\n 1 antrian telah di hapus"); puts(dequeue()); break; case '3': display(); break; case '4': init(); break; case '5': printf(" Terima Kasih !!! "); exit(0); getch(); default: printf("\n Masukan salah"); } printf("\n Press Any Key to continue..."); fflush(stdin); while(!kbhit()); } while(1); return 0; } void init() { pq->head = pq->tail = pq->count= 0; cout<<"\n . . Reset data Berhasil . . \n . . .Antrian Kosong. . ."; }

char* enqueue(char *p) { if(pq->count==QSIZE) return "\n Antrian penuh"; pq->tail= (pq->tail)%QSIZE; strcpy(pq->names[(pq->tail)++],p); pq->count++; return "\n Data Sukses dimasukkan"; } char* dequeue() { if(pq->count==0) return "\n Antrian Penuh !"; pq->head= (pq->head)%QSIZE; pq->count--; printf("\n Menghapus 1 data, yaitu : "); return pq->names[(pq->head)++]; } void display() { int i=pq->head; int x=0; if(pq->count==0) { printf("\n Antrian Kosong"); printf("\n Tidak Ada Data Yang ditampilkan"); } else { while(x<pq->count) { if(i==QSIZE) i%=QSIZE; cout<<"\n > "; cout<<pq->names[i]; i++; x++; } } }

Hasil

1. Tampilan awal program

2. Option 1 untuk memasukkan data

3. Option 3 untuk melihat hasil yang dimasukkan antrian , dan Maksimal isi antrian adalah 5,

4. Jika ada 5 masukkan, maka antrian akan penuh dan tidak bisa ditambah antrian lagi

5. Jika ingin menambah antrian, maka harus mengeluarkan antrian paling luar dengan memilih nomer 2

6. Untuk lebih jelas lihat daftar antrian dengan plihan nomer 3, data fauzul tidak ada

7. Dengan begitu bisa menambah lagi daftar antrian

8. Dan bisa di lihat lagi hasilnya apakah sudah masuk atau tidak

9. Jika ingin menghapus semua daftar antrian menggunakan option 4, maka daftar antrian akan kembali kosong lagi

10. Lihat daftar antrian

11. Jika ingin mengakhiri program tekan nomer 4

2. Tugas rumah 2. Buatlah sebuah program dengan menerapkan contoh kasus sebuah queue dari praktikum kali ini. Program : Daftar Antrian Pada Rumah Sakit Script Program

#include <iostream.h> #include <conio.h> #include <stdio.h> typedef struct { int data[100];

char data1[100][20]; char data2[100][30]; char data3[100][15]; int depan; int belakang; }Queue; Queue Queue Queue Queue antrian; no; nama; poli;

int pilihan, data, i, j; char data1[20], data2[30], data3[15]; int isEmpty() { if (antrian.belakang==-1) return 1; else return 0; } int isFull() { if(antrian.belakang==100) return 1; else return 0; } void Enqueue(int data, char data1[20], char data2[30], char data3[15]) { if(isEmpty()==1) { antrian.depan=antrian.belakang=0; nama.depan=nama.belakang=0; poli.depan=poli.belakang=0; no.depan=no.belakang=0; antrian.data[antrian.belakang]=data; for(i=0;i<20;i++) { nama.data1[nama.belakang][i]=data1[i]; } for(i=0;i<30;i++) { poli.data2[poli.belakang][i]=data2[i]; } for(i=0;i<15;i++) { no.data3[no.belakang][i]=data3[i]; } printf("\n\n ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: \n"); printf(" Data anda telah masuk. silahkan menunggu panggilan"); } else if(isFull()==0) { antrian.belakang++; nama.belakang++; poli.belakang++; no.belakang++; antrian.data[antrian.belakang]=data; for(i=0;i<20;i++) { nama.data1[nama.belakang][i]=data1[i]; } for(i=0;i<30;i++) {

poli.data2[poli.belakang][i]=data2[i]; } for(i=0;i<15;i++) { no.data3[no.belakang][i]=data3[i]; } printf("\n\n ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: \n"); printf(" Data anda telah masuk. silahkan menunggu panggilan"); } } int Dequeue() { if(isEmpty()==0) { int i,e ; char a[20], b[30]; e=antrian.data[antrian.depan]; for(i=0;i<20;i++) { a[i]=nama.data1[nama.depan][i]; } for(i=0;i<30;i++) { b[i]=poli.data2[poli.depan][i]; } for(i=antrian.depan;i<antrian.belakang;i++) { antrian.data[i]=antrian.data[i+1]; for(j=0;j<20;j++) { nama.data1[i][j]=nama.data1[i+1][j]; } for(j=0;j<30;j++) { poli.data2[i][j]=poli.data2[i+1][j]; } for(j=0;j<15;j++) { no.data3[i][j]=no.data3[i+1][j]; } } antrian.belakang--; nama.belakang--; poli.belakang--; no.belakang--; printf("antrian no %i dengan nama %s silahkan memasuki poli %s !", e, a, b); return e; return a[20]; return b[30]; } else { printf("antrian kosong"); } } void buat() { antrian.depan=antrian.belakang=-1; nama.depan=nama.belakang=-1; poli.depan=poli.belakang=-1; no.depan=no.belakang=-1; } void main() { int n;

buat(); n=1; do { clrscr(); printf(" ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: \n"); printf(" :: :: \n"); printf(" :: Rumah Sakit SIDOWARAS :: \n"); printf(" :: kec. Bangsal, Kabupaten Mojokerto :: \n"); printf(" :: :: \n"); printf(" ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: \n"); printf(" Menu : \n\n"); printf(" 1. Masukkan Data Antrian \n"); printf(" 2. Panggil Antrian \n"); printf(" 3. Lihat Daftar Antrian \n"); printf(" 4. Menghapus Seluruh Antrian Pasien ( Reset Ulang ) \n"); printf(" 5. Exit \n"); printf(" ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: \n"); printf(" Silahkan Masukkan Pilihan (1-5) : "); scanf("%i", &pilihan); printf(" ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: \n\n\n"); switch(pilihan) { case 1 : clrscr(); printf(" ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: \n"); printf(" :: DATA PASIEN :: \n"); printf(" ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: \n\n"); data=n; printf(" No antrian anda adalah %i \n", n); printf(" Masukkan no. rekam medis anda : "); fflush(stdin); gets(data3); printf(" Masukkan nama lengkap anda: "); fflush(stdin); gets(data1); printf(" Masukkan poli berobat anda: "); fflush(stdin); gets(data2); Enqueue(data, data1, data2, data3); n++; break; case 2 : clrscr(); printf(":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : \n"); printf(" "); Dequeue(); printf("\n\n::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: "); break; case 3 : clrscr(); if(isEmpty()==1) { printf("\n ------------------------------------------------------------- \n"); printf(" | No antrian | No.reka medis | Nama Lengkap | Poli Berobat | \n"); printf(" ----------------------------------------------------------------- \n"); printf(" ---Antrian Kosong ---- \n"); break; } printf("\n --------------------------------------------------------------------------- \n");

printf(" | No antrian | No.reka medis | Nama Lengkap | Poli | \n"); printf(" --------------------------------------------------------------------------- \n"); for(i=antrian.depan;i<=antrian.belakang;i++) { gotoxy(3,i+5); cout<<"| "<<antrian.data[i]; gotoxy(16,i+5); cout<<"| "<<no.data3[i]; gotoxy(32,i+5); cout<<"| "<<nama.data1[i]; gotoxy(60,i+5); cout<<"| "<<poli.data2[i]; gotoxy(77,i+5); cout<<"|"; } break; Berobat case 4 : buat(); printf(" . . .Reset Antrian Berhasil. . . break;

!!!");

case 5: printf(" Terimakasih Atas Partisipasinya !!!"); break; default : printf(" Maaf,, Pilihan Anda Salah "); break; } getch(); }while(pilihan!=5); }

Hasil

1. Tampilan awal program

2. Option 1 untuk memasukkan data a. Masukkan 1

b. Masukkan 2

c. Masukkan 3

d. Masukkan 4

.dsb

3. Option 3 untuk melihat daftar antrian pasien yang sudah masuk

4. Daftar pasien bisa di tambah sampai dengan 100 pasien, dan jika penuh daftar antrian pasien bisa dikurangi atau menghapus seluruh daftar antrian pasien a. Daftar antrian dikurangi dengan memanggil pasien yang memasukkan data paling awal dengan option nomer 2.

b. Menghapus seluruhantrian pasien yang ada dengan option nomer 4.

5. Lihat daftar antrian lagi apakah ada atau tidak

6. Jika ingin mengakhiri program ini tekan nomer 4

F. Kesimpulan Queue / Antrian adalah suatu kumpulan data yang mana penambahan elemen hanya bisa dilakukan pada satu ujung (disebut dengan sisi belakang atau rear) dan penghapusan atau pengambilan elemen dilakukan lewat ujung lain (disebut dengan sisi depan atau front). Sedangkan DEQUE adalah antrian dimana elemennya bisa masuk dan keluar lewat kedua ujungnya Ada beberapa Operasi Dasar Pada Queue yang dapat dilakukan pada struktur data antrian, yaitu: CREATE(Q), SEMPTY(Q), Enqueue(), Dequeue(), Clear(), Tampil()

G. Daftar Pustaka Modul pratikum Algoritma dan Struktur data. 2012. Fakultas teknik - Universitas negeri malang