Anda di halaman 1dari 66

Laporan Praktikum

Struktur Data

Materi :

Implementasi Stack dan Queue

Dosen Pengajar:

Hendra Prastiawan, S.SI., MT

Disusun Oleh:

Nama: Fendyanto

NIM: 31190038

FAKULTAS TEKNOLOGI DAN DESAIN

UNIVERSITAS BUNDA MULIA

2020 – 2021
DAFTAR ISI

DAFTAR ISI .............................................................................................................................ii


Kata Pengantar ......................................................................................................................... iii
Stack ........................................................................................................................................... 1
1.1 Pendahuluan ................................................................................................................ 1
1.2 Definisi Stack .............................................................................................................. 1
1.3 Stack Menggunakan Array .......................................................................................... 2
1.3.1 Pembahasan Soal 1 – Implementasi Stacks dengan Array ...................................... 4
1.4 Stack Menggunakan Linked List............................................................................... 14
1.4.1 Pembahasan Soal 2 – Implementasi Stack dengan Linked List ............................ 17
Queue ....................................................................................................................................... 27
2.1 Pendahuluan .............................................................................................................. 27
2.2 Definisi Queue........................................................................................................... 27
2.3 Queue Menggunakan Array ...................................................................................... 28
2.3.1 Pembahasan Soal 3 – Implementasi Queue dengan Circular Array ...................... 31
2.4 Queue Menggunakan Linked List ............................................................................. 52
2.4.1 Pembahasan Soal 4 – Implementasi Queue dengan Linked List ........................... 54
Kesimpulan .............................................................................................................................. 63

ii
Kata Pengantar

Dengan memanjatkan puji dan syukur ke hadirat Tuhan Yang Maha Esa, yang telah
melimpahkan berkat dan rahmatNya, sehingga saya dapat menyelesaikan laporan praktikum
mata kuliah Struktur Data mengenai implementasi stack dan queue menggunakan linked list
dan array.

Terlepas dari semuanya itu, saya menyadari sepenuhnya bahwa masih ada kekurangan
baik dari segi susunan kalimat maupun tata bahasanya. Oleh karena itu dengan tangan terbuka
saya menerima segala saran dan kritik dari pembaca agar saya dapat memperbaiki laporan
praktikum ini.

Akhir kata saya berharap semoga laporan ini dapat memberikan manfaat maupun
inpirasi terhadap pembaca.

Tangerang, 02 April 2020

Penyusun

iii
Stack

1.1 Pendahuluan
Stack disebut juga tumpukan, dimana data hanya dapat dimasukan dan diambil dari satu sisi.
Oleh karena itu Stack mempunya prinsip LIFO (Last in First Out).

1.2 Definisi Stack


Merupakan struktur data linear yang dapat diakses hanya pada satu sisi untuk menyimpan dan
mengambil data, yakni melalui bagian top atau bagian ujung data teratas dari tumpukan tersebut.

Ada dua cara penerapan prinsp stack, yakni dengan array dan linked list. Berikut merupakan
beberapa operasi yang setidaknya harus ada dalam penggunaan stack.

a. Push Untuk menambahkan item pada tumpukan paling atas.


b. Pop Untuk mengeluarkan item.
c. Clear Untuk mengosongkan stack/tumpukan.
d. IsEmpty Untuk memeriksa apakah stack kosong.
e. IsFull Untuk memeriksa apakah stack sudah penuh.

1
1.3 Stack Menggunakan Array
Dalam implementasi stack menggunakan array. Kita perlu untuk memahami lebih dalam
mengenai beberapa operasi dasar yang akan digunakan.

Konstruktor, Dalam operasi yang hanya dilakukan diawal pembuatan stack, kita diharuskan untuk
mendeklarasikan array berserta kapasitasnya sebagai tempat menyimpan data. Selanjutnya kita juga
akan mendeklarasikan variabel top bernilai -1, sebagai inisialisasi awal bahwa tumpukan data masih
kosong.

IsFull, Operasi untuk memeriksa apakah stack yang ada sudah penuh. Stack penuh jika stack penuh
jika puncak stack terdapat tepat dibawah jumlah maksimum yang dapat ditampung stack atau dengan
kata lain Top = MAX_STACK -1. Mengapa tepat di bawah jumlah maksimum. Karena dalam array
index dimulai dari 0, sehingga apabila kita mendeklarasikan array berkapasitas 10 index, maka index
maksimalnya adalah 9 (10-1).

Push, Operasi ini berfungsi untuk menambahkan elemen/data ke dalam stack. Operasi ini tidak bisa
dilakukan lagi apabila stack sudah penuh.

2
IsEmpty, Operasi ini menentukan apakah stack kosong apa tidak. Tanda bahwa stack kosong adalah
top bernilai -1.

Pop, Operasi ini digunakan untuk mengambil/mengeluarkan elemen teratas pada stack dengan syarat
stack tidak boleh kosong.

Clear, Berfungsi untuk mengosongkan stack, dengan cara menreset nilai top menjadi -1. Sehingga
apabila top bernilai -1, maka stack akan diasumsikan kosong.

3
1.3.1 Pembahasan Soal 1 – Implementasi Stacks dengan Array
Buatlah sebuah program untuk mengimplementasikan stacks dan operasi-operasinya dengan array.
Buatlah function-function isEmpty(), Clear(), push(el), pop(), dan topEl() untuk mengimplementasikan
operasi-operasi stacks, kemudian implementasikan untuk membuat aplikasi stack.

Jawaban :

#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;

#define batas "==========================================\n"


#define MaxSize 10

int StackArray[MaxSize];
int top = -1;

bool Kosong();
bool IsFull();
void menu();
void Push(int El);
void Pop();
void TopEl();
void Clear();
void IsEmpty();
void Show();
void PressAnyKey();

int main() {

menu();

return 0;
}

void menu() {

char Pilihan;
int El;
do {
system("cls");
cout << batas;
cout << " Program Struktur Data " << endl;
cout << " Stack Dengan Array " << endl;
cout << "-------------------Menu-------------------" << endl;
cout << "1. Tambah Data ke Stack" << endl;
cout << "2. Keluarkan Data dari Stack" << endl;
cout << "3. Tampilkan Data Teratas pada Stack" << endl;
cout << "4. Bersihkan Stack" << endl;
cout << "5. Check Stack Apakah Kosong" << endl;
cout << "6. Tampilkan Isi Stack" << endl;
cout << "0. Keluar" << endl;
cout << batas;
cout << endl;

cout << "Pilihan : ";


cin >> Pilihan;
cout << endl;

4
switch (Pilihan) {

case '1': {
int i = 1;
cout << "Input Data, untuk mengakhiri dengan 0" << endl;
do {
cout << "Input Data ke " << i << " : ";
cin >> El;
cout << endl;
if (Kosong()) {
cout << "Stack Penuh, Mohon [Keluarkan Data] agar dapat
Menambahkan Data" << endl << endl;
break;
}
else if (El == 0) {
break;
}
else {
Push(El);
i++;
}

} while (true);
PressAnyKey();
break;
}

case '2': {
Pop();
PressAnyKey();
break;
}

case '3': {
TopEl();
PressAnyKey();
break;
}

case '4': {
Clear();
break;
}

case '5': {
IsEmpty();
break;
}

case '6': {
Show();
break;
}

case '0': {
cout << "Terima Kasih...." << endl;
exit(0);
}
default: {
cout << "Pilihan Tidak Tersedia, Silahkan Pilih Pilihan yang
Tersedia [1-6]" << endl << endl;
}

} while (true);
}

5
bool Kosong() {
if (top == -1) {
return true;
}
else {
return false;
}
}

bool IsFull() {
if (top == MaxSize - 1) {
return true;
}
else {
return false;
}
}

void Push(int El) {

if (IsFull()) {
cout << "Stack Penuh, Mohon [Keluarkan Data]
agar dapat Menambahkan Data" << endl;
return;
}
top++;
StackArray[top] = El;
}

void Pop() {

if (Kosong()) {
cout << "Stack Telah Kosong, Tidak Dapat
Mengeluarkan Data dari Stack" << endl << endl;
return;
}
cout << "Data yang dipop : " << StackArray[top] << endl;
StackArray[top] = NULL;
top--;
cout << endl;
}

void TopEl() {

if (Kosong()) {
cout << "Stack Telah Kosong, Tidak Ada Data
pada Top Stack" << endl << endl;
return;
}
cout << "Data yang Ada pada Top Stack : " << StackArray[top] << endl << endl;
}

void Clear() {

if (Kosong()) {
cout << "Stack Telah Kosong, Tidak perlu Mengosongkan Stack" << endl;
PressAnyKey();
return;
}
for (int i = top; i >= 0; i--) {
StackArray[i] = NULL;
}
top = -1;
cout << "Stack Sudah Dibersihkan" << endl;
PressAnyKey();
}

6
void IsEmpty() {

if (Kosong()) {
cout << "Stack Kosong" << endl;
PressAnyKey();
return;
}
cout << "Stack ada Isinya" << endl;
PressAnyKey();
}

void Show() {

if (Kosong()) {
cout << "Stack Kosong, Tidak Ada Data yang Dapat Ditampilkan" << endl;
PressAnyKey();
return;
}
cout << "Isi Stack : " << endl;
for (int i = top; i >= 0; i--) {
cout << StackArray[i] << endl;
}
PressAnyKey();
}

void PressAnyKey() {
cout << "Tekan Sembarang Tombol untuk Melanjutkan!!! ";
getch();
cout << endl << endl;
}

7
Screen Captures Pengujian Program

Gambar 1 - Menu Stack

Gambar 2 - Percobaan Input Data Pada Stack

8
Gambar 3 – Uji Coba isEmpty()stacks

Gambar 4 – Lihat isi Stacks setelah diinputkan pertama kali

9
Gambar 5 – Uji coba operasi topEl()

Gambar 6 –isi stacks setelah di tampikan dengan topEl() tidak berubah

10
Gambar 7 – uji coba operasi pop()

Gambar 8 – isi stack setelah di pop() berubah

11
Gambar 9 – uji coba pop() kedua

Gambar 10 – uji coba pop() ketiga

12
Gambar 11 – isi stacks setelah di pop 3 kali sisa dua data

Gambar 12 – Uji coba membersihkan stacks

13
Gambar 13 – check isi stacks setelah dikosongkan

1.4 Stack Menggunakan Linked List


Dalam implementasi stack menggunakan C++ kita juga bisa menggunakan linked list. Dalam
Linked list, stack akan tersimpan secara dinamis karena elemen akan tersimpan di dalam memori
komputer selama memori komputer masih tersedia. Penghapusan elemen dalam linked list akan lebih
baik ketimbang array. Karena dalam linked list, setiap elemen yang terhapus tidak akan meninggalkan
tempat kosong dalam memori. Hal ini tidak berlaku pada array dimana penghapusan elemen akan tetap
meninggalkan memori dengan tempat kosong. Namun disamping itu, linked list akan menggunakan
memori, karena setiap node yang ada akan terisi dengan elemen dan referensi ke node berikutnya.

Berikut merupakan beberapa operasi yang dapat dilakukan dalam implementasi stack
menggunakan linked list.

Konstruktor, fungsi ini membuat stack baru yang kosong. Stack akan kosong apabila top tidak
menunjuk (menreferensi) apapun “NULL”.

14
IsEmpty, operasi untuk memeriksa apakah stack yang ada masih kosong atau tidak.

Push, Operasi yang berfungsi untuk memasukan elemen baru ke dalam stack. Push dalam stack-linked
list mirip dengan push pada single linked list biasa.

Pop, fungsi ini mengeluarkan elemen teratas dari stack apabila stack tidak dalam keadaan kosong.

15
Clear, Operasi ini berfungsi untuk mengosongkan isi stack. Dilakukan dengan merubah referensi dari
top menjadi “NULL”.

TopEl, digunakan untuk melihat elemen teratas yang ada pada stack, dapat dijalankan apabila stack
tidak dalam keadaan kosong atau “NULL”.

Show, berfungsi untuk menampilkan seluruh tumpukan stack mulai dari tumpukan teratas hingga ke
tumpukan terbawah, dapat dijalankan apabila stack tidak dalam keadaan kosong atau “NULL”.

16
1.4.1 Pembahasan Soal 2 – Implementasi Stack dengan Linked List
Buatlah sebuah program untuk mengimplementasikan stacks dan operasi-operasinya dengan linked list.
Buatlah function-function isEmpty(), Clear(), push(el), pop() dan topEl() untuk mengimplementasikan
operasi-operasi stacks, kemudian implementasikan untuk membuat aplikasi stack seperti contoh pada
task 1. Tampilan, data yang diinputkan dan urutan percobaannya seperti pada soal 1.

Jawaban:

#include <iostream>
#include <conio.h>
using namespace std;
#include <stdlib.h>
#define batas "==========================================\n"
struct Stack {
int data;
Stack* link;
};

struct Stack* top = NULL;


bool Kosong();
void menu();
void Push(int El);
void Pop();
void TopEl();
void Clear();
void IsEmpty();
void Show();
void PressAnyKey();

int main() {

menu();
return 0;
}

void menu() {

char Pilihan;
int El;
do {
system("cls");
cout << batas;
cout << " Program Struktur Data " << endl;
cout << " Stack Dengan Linked List " << endl;
cout << "-------------------Menu-------------------" << endl;
cout << "1. Tambah Data ke Stack" << endl;
cout << "2. Keluarkan Data dari Stack" << endl;
cout << "3. Tampilkan Data Teratas pada Stack" << endl;
cout << "4. Bersihkan Stack" << endl;
cout << "5. Check Stack Apakah Kosong" << endl;
cout << "6. Tampilkan Isi Stack" << endl;
cout << "0. Keluar" << endl;
cout << endl;
cout << batas;

cout << "Pilihan : ";


cin >> Pilihan;
cout << endl;

17
switch (Pilihan) {

case '1': {
int i = 1;
cout << "Input Data, untuk mengakhiri dengan 0" << endl;
do {
while (true) {
cout << "Input Data ke " << i << " : ";
cin >> El;
if (cin.fail()) {
cin.clear();
cin.ignore(10000, '\n');
continue;
}
else {
break;
}
}
cout << endl;
if (El == 0) {
break;
}
else {
Push(El);
i++;
}

} while (true);
PressAnyKey();
break;
}

case '2': {
Pop();
PressAnyKey();
break;
}

case '3': {
TopEl();
PressAnyKey();
break;
}

case '4': {
Clear();
PressAnyKey();
break;
}

case '5': {
IsEmpty();
break;
}

case '6': {
Show();
break;
}

case '0': {
cout << "Terima Kasih...." << endl;
exit(0);
}

default: {
cout << "Pilihan Tidak Tersedia,

18
Silahkan Pilih Pilihan yang Tersedia [1-6]" << endl << endl;
}

} while (true);
}

bool Kosong() {
if (top == NULL) {
return true;
}
else {
return false;
}
}

void Push(int El) {

Stack* temp = new Stack;


if (temp == NULL) {
cout << "Tidak Dapat Menginput Data, Memory Penuh." << endl << endl;
return;
}
temp->data = El;
temp->link = top;
top = temp;
}

void Pop() {

if (Kosong()) {
cout << "Stack Telah Kosong, Tidak Dapat Mengeluarkan Data dari Stack"
<< endl << endl;
return;
}
Stack* temp = top;
cout << "Data yang dipop : " << temp->data << endl << endl;
top = top->link;
temp = NULL;
delete temp;
}

void TopEl() {

if (Kosong()) {
cout << "Stack Telah Kosong, Tidak Ada Data pada Top Stack" << endl << endl;
return;
}
cout << "Data yang Ada pada Top Stack : " << top->data << endl << endl;
}

void Clear() {

if (Kosong()) {
cout << "Stack Telah Kosong, Tidak Dapat Mengosongkan Stack" << endl << endl;
return;
}
top = NULL;
cout << "Stack Sudah Dibersihkan" << endl;

19
void IsEmpty() {

if (Kosong()) {
cout << "Stack Kosong" << endl;
PressAnyKey();
return;
}
cout << "Stack ada Isinya" << endl;
PressAnyKey();
}

void Show() {

if (Kosong()) {
cout << "Stack Kosong, Tidak Ada Data yang Dapat Ditampilkan" << endl << endl;
PressAnyKey();
return;
}

cout << "Isi Stack : " << endl;


Stack* temp = top;
while (temp != NULL) {
cout << temp->data << endl;
temp = temp->link;
}
cout << endl;
PressAnyKey();
}

void PressAnyKey() {
cout << "Tekan Sembarang Tombol untuk Melanjutkan!!! ";
getch();
cout << endl << endl;
}

Screen Captures Pengujian Program

Gambar 1 – Menu Stacks

20
Gambar 2 – Percobaan Input Data pada Stacks

Gambar 3 – Uji Coba isEmpty()stacks

21
Gambar 4 – Lihat isi Stacks setelah diinputkan pertama kali

Gambar 5 – Uji coba operasi topEl()

22
Gambar 6 –isi stacks setelah di tampikan dengan topEl() tidak berubah

Gambar 7 – uji coba operasi pop()

23
Gambar 8 – isi stack setelah di pop() berubah

Gambar 9 – uji coba pop() kedua

24
Gambar 10 – uji coba pop() ketiga

Gambar 11 – isi stacks setelah di pop 3 kali sisa dua data

25
Gambar 12 – Uji coba membersihkan stacks

Gambar 13 – check isi stacks setelah dikosongkan

26
Queue

2.1 Pendahuluan
Queue disebut juga antrian, dimana elemen hanya dapat dimasukan melalui bagian belakang
“rear” antrian dan data hanya dapat dikeluarkan melalui bagian depan “front” antrian. Oleh karena
itu Queue mempunyai prinsip FIFO (First in First Out).

2.2 Definisi Queue


Merupakan struktur data linear dimana penambahan dan penghapusan elemen dilakukan pada
ujung yang berbeda. Penambahan dilakukan pada ujung antrian belakang “rear”, sedangkan
penghapusan elemen dilakukan pada ujung antrian terdepan “front”.

Ada dua cara penerapan prinsp queue, yakni dengan array dan linked list. Berikut merupakan
beberapa operasi dasar yang umumnya ada dalam penggunaan queue.

Enqueue Untuk menambahkan elemen pada antrian paling belakang dari queue.
Dequeue Untuk mengeluarkan elemen antrian terdepan dari queue.
Clear Untuk mengosongkan queue/antrian.
IsEmpty Untuk memeriksa apakah queue kosong.
IsFull Untuk memeriksa apakah queue sudah penuh.
FirstEl Untuk membaca first elemen dari queue tanpa menghapusnya.

27
2.3 Queue Menggunakan Array
Untuk implementasi queue menggunakan array sendiri terdapat dua jenis array yang dapat
digunakan, yaitu liniear dan circular. Perbedaan yang paling mencolok yaitu, dalam circular array setiap
index array akan terhubung secara sekuensial layaknya liniear array, namun bagian index terakhir akan
seolah-olah dikoneksikan dengan index pertama (index 0) sehingga dapat digambarkan seperti
lingkaran. Sedangkan dalam Liniear array, tidak ada koneksi antara index terakhir dengan index pertama
dari array tersebut.

Dalam laporan kali ini saya hanya akan membahas penggunaan queue menggunakan circular
array. Karena menurut saya akan lebih menguntungkan apabila kita menggunakan Circular array.
Circular array membuat kita bisa menggunakan semua alokasi index yang ada dalam array tersebut tanpa
terkecuali, hal ini membuat kita bisa menggunakan array tersebut lebih maksimal ketimbang
menggunakan linier array.

Gambar Linier Array

Gambar Circular Array

Dalam implementasi Queue menggunakan circular array. Kita perlu untuk memahami lebih
dalam mengenai beberapa operasi dasar yang akan digunakan.

Konstruktor, berguna untuk menciptakan queue yang baru dan kosong, yaitu dengan cara memberikan
nilai awal (front) dengan minus (-1) dan nilai akhir (rear) dengan minus 1 (-1). Sebagai tanda bahwa
deklarasi antrian kosong, karena index array mula-mula dimulai dari index 0.

28
IsEmpty, berguna untuk mengecek apakah Queue masih kosong atau sudah berisi. Hal ini dilakukan
dengan mengecek apakah rear masih memiliki nilai yang sama dengan fronts yakni minus 1(-1).Jika
benar, maka queue masih kosong.

Enqueue, berguna untuk memasukkan sebuah elemen ke dalam queue selama masih tersedia alokasi.
Ketika elemen pertama masuk, maka nilai fronts dan rear akan di set menjadi nol, dan elemen tersebut
akan menempati index array dari nilai rear. Namun apabila elemen tersebut bukan merupakan elemen
pertama, maka elemen tersebut akan menempati index array dari nilai (rear+1) % MaxSize. Hal inilah
yang akan membuat array seolah-olah menjadi circular.

29
Dequeue, berguna untuk mengambil sebuah elemen terdepan dari queue. Hal ini dilakukan dengan cara
memindahkan posisi fronts satu langkah ke belakang. Apabila queue kosong maka operasi ini tidak dapat
dilakukan. Sedangkan apabila elemen yang berada dalam queue hanya ada satu, maka nilai fronts dan
rear akan dibuat menjadi -1 sehingga queue akan di asumsikan kembali kosong. Namun apabila terdapat
lebih dari satu elemen dalam queue, maka nilai fronts akan berubah menjadi (fronts+1) % MaxSize. Hal
inilah yang akan membuat array seolah-olah circular.

IsFull, berguna untuk mengecek apakah queue sudah penuh atau masih bisa menampung elemen dengan
cara mengecek apakah index sebelah dari index antrian belakang (rear) merupakan bagian antrian
terdepan (fronts). Bila hal tersebut benar, maka queue sudah penuh. Namun bila tidak, maka queue masih
bisa menampung elemen.

FirstEl, berguna untuk menampilkan elemen pertama/terdepan dalam suatu antrian.

30
Clear, berfungsi untuk mengosongkan isi dari queue dengan cara mengeset nilai dari fronts dan rear
menjadi -1 untuk asumsi bahwa queue telah kosong.

2.3.1 Pembahasan Soal 3 – Implementasi Queue dengan Circular Array


Buatlah sebuah program untuk mengimplementasikan queue dan operasi-operasinya dengan array.
Buatlah function-function isEmpty(), Clear(), enqueue (el), dequeue() dan firstEl() untuk
mengimplementasikan operasi-operasi queue, kemudian implementasikan untuk membuat aplikasi
queue seperti contoh.

Jawaban:
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#define batas "==========================================\n"
using namespace std;

#define MaxSize 10
int Queues[MaxSize];
int fronts = -1;
int rear = -1;
int n = (sizeof(Queues) / sizeof(Queues[0]));

bool Kosong() {

if (rear < 0) {
return true;
}
else {
return false;
}
}

void menu();
void Enqueue(int num);
void Dequeue();
void FirstEl();
void Clear();
void IsEmpty();
void Show();
void PressAnyKey();

int main() {

menu();

return 0;
}

31
void menu() {

char Pilihan;
int El;
int i = 1;
do {
system("cls");
cout << batas;
cout << " Program Struktur Data " << endl;
cout << " Queue Dengan Array " << endl;
cout << "-------------------Menu-------------------" << endl;
cout << "1. Tambah Data ke Queue" << endl;
cout << "2. Keluarkan Data dari Queue" << endl;
cout << "3. Tampilkan Data Teratas pada Queue" << endl;
cout << "4. Bersihkan Queue" << endl;
cout << "5. Check Queue Apakah Queue Kosong" << endl;
cout << "6. Tampilkan Isi Queue" << endl;
cout << "0. Keluar" << endl;
cout << endl;
cout << batas;

cout << "Pilihan : ";


cin >> Pilihan;
cout << endl;

switch (Pilihan) {

case '1': {

cout << "Input Data, untuk mengakhiri dengan 0" << endl;
do {
while (true) {
cout << "Input Data ke " << i << " : ";
cin >> El;
if (cin.fail()) {
cin.clear();
cin.ignore(1000, '\n');
continue;
}
else {
break;
}
}
if (El == 0) {
break;
}
else if ((rear + 1) % n == fronts) {
cout << "Tidak Bisa Menambahkan Data Ke-" << i << " ke
Queue, Circular Array Telah Penuh" << endl;
cout << "Mohon Lakukan Hapus Data, Agar Dapat Menambahkan
Data ke Dalam Queue" << endl;
break;
}
else {
Enqueue(El);
cout << "pool [" << (rear) % n << "] " << El << endl
<< endl;
i++;
}

} while (true);
PressAnyKey();
break;
}

case '2': {
Dequeue();
break;

32
}

case '3': {
FirstEl();
break;
}

case '4': {
Clear();
i = 1;
break;
}

case '5': {
IsEmpty();
break;
}

case '6': {
Show();
break;
}

case '0': {
cout << "Terima Kasih...." << endl;
exit(0);
}

default: {
cout << "Pilihan Tidak Tersedia, Silahkan Pilih Pilihan yang Tersedia
[1-6]" << endl << endl;
PressAnyKey();
}

} while (true);

void Enqueue(int num) {

if (rear == -1) {
fronts = rear = 0;
}
else if ((rear + 1) % n == fronts) {
cout << "Tidak Bisa Menambahkan Data ke Queue, Circular Array Telah Penuh"
<< endl;
cout << "Mohon Lakukan Hapus Data, Agar Dapat Menambahkan Data ke Dalam Queue"
<< endl;
PressAnyKey();
}
else {
rear = (rear + 1) % n;
}
Queues[rear] = num;
}

void Dequeue() {

if (Kosong()) {
cout << "Tidak Bisa Mengeluarkan Data Queue, Karena Queue Tidak Memiliki Data"
<< endl;
}

33
else if (rear == fronts) {
cout << "Pool[" << fronts << "] " << Queues[fronts] << " Be Cleared | next
first pool is NULL" << endl;
cout << "Data yang di Dequeue : " << Queues[fronts] << endl;
Queues[rear] = NULL;
rear = fronts = -1;
}
else {
cout << "Pool[" << fronts << "] " << Queues[fronts] << " Be Cleared | next
first pool is " << fronts + 1 << endl;
cout << "Data yang di Dequeue : " << Queues[fronts] << endl;
fronts = (fronts + 1) % n;
}
PressAnyKey();
}

void FirstEl() {

if (Kosong()) {
cout << "Tidak Bisa Menampilkan Data First Queue, Karena Queue Tidak Memiliki
Data" << endl;
}
else {
cout << "Data Yang Ada Pada First Queue : " << Queues[fronts] << endl;
}
PressAnyKey();
}

void Clear() {

if (Kosong()) {
cout << "Tidak Bisa Mengosongkan Data Queue, Karena Queue Tidak Memiliki Data"
<< endl;
}
else {
fronts = -1;
rear = -1;
cout << "Queue Sudah Dibersikan" << endl;
}
PressAnyKey();
}

void IsEmpty() {

if (Kosong()) {
cout << "Queue Kosong" << endl;
}
else {
cout << "Queue Ada Isinya" << endl;
}
PressAnyKey();
}

void Show() {

if (Kosong()) {
cout << "Tidak Bisa Menampilkan Data Queue, Karena Queue Tidak Memiliki Data"
<< endl;
}
else if (fronts == rear) {
cout << "Isi Queue" << endl;
cout << "Data Ke 1 " << "Pool[" << fronts << "] " << Queues[fronts] << endl;
}

34
else {
cout << "Isi Queue" << endl;
int k = 1;
if (rear >= fronts) {

for (int i = fronts; i <= rear; i++) {


cout << "Data Ke " << k << " Pool[" << i << "] " << Queues[i]
<< endl;
k++;
}

}
else {
for (int i = fronts; i < n; i++) {
cout << "Data Ke " << k << " Pool[" << i << "] " << Queues[i]
<< endl;
k++;
}
for (int i = 0; i <= rear; i++) {
cout << "Data Ke " << k << " Pool[" << i << "] " << Queues[i]
<< endl;
k++;
}
}
}
PressAnyKey();
}

void PressAnyKey() {
cout << "Tekan Sembarang Tombol untuk Melanjutkan!!! ";
getch();
cout << endl << endl;
}

Screen Captures Pengujian Program

Gambar 1 – menu queue

35
Gambar 2 – uji coba mengisi data pada queue dengan circular array

36
Gambar 3 – tampilkan isi queue

Gambar 4 – melihat isi queue yang pertama

37
Gambar 5 – isi queue setelah di operasikan dengan firstEl() tidak berubah

Gambar 6 – uji coba dequeue()

38
Gambar 7 – isi queue setelah operasi dequeue() berubah

Gambar 8 – dequeue() kedua

39
Gambar 9 – dequeue() ketiga

Gambar 10 – dequeue() keempat

40
Gambar 11 – dequeue kelima

Gambar 12 – isi queue setelah 5 kali operasi dequeue() tersisa tiga data

41
Gambar 13 – input data untuk uji coba implementasi circular array, data
diinputkan sampai melewati array ke 9,

42
Gambar 14 – Tampikan isi queue untuk membuktikan array benar-benar
circular

Gambar 15 – Uji ciba firstEl() pada queue yang sudah terjadi circular pada
array

43
Gambar 16 – tampilkan isi queue untuk membuktikan bahwa dengan
firstEl() pada array yang sudah circular

Gambar 17 – melakukan dequeue() pada array yang sudah mengalami


circular

44
Gambar 18 – tampilkan isi queque untuk membuktikan bahwa dequeue()
pada array yang sudah mengalami Circular tetap berjalan dengan baik

Gambar 19 – lakukan dequeue ke-7 untuk ujicoba setelah array mengalami


circular dan di dequeue tetap berjalan dengan baik

45
Gambar 20 - lakukan dequeue ke-8 untuk ujicoba setelah array mengalami
circular dan di dequeue tetap berjalan dengan baik

Gambar 21 - lakukan dequeue ke-9 untuk ujicoba setelah array mengalami


circular dan di dequeue tetap berjalan dengan baik

46
Gambar 22 - lakukan dequeue ke-10 untuk ujicoba setelah array
mengalami circular dan di dequeue tetap berjalan dengan baik

Gambar 23 - lakukan dequeue ke-11 untuk ujicoba setelah array


mengalami circular dan di dequeue tetap berjalan dengan baik

47
Gambar 24 – tampikan isi queue untuk membuktikan bahwa setelah array mengalami circular dan di
dequeue beberapa kali, data pada array tidak kacau beberapa kali, data pada array tidak kacau

Gambar 25 – Uji coba isEmpty() setelah array pada queue mengalami


circular

48
Gambar 26 – Uji coba membersihkan queue

Gambar 27 – Check apakah pembersihan berjalan baik atau tidak

49
Gambar 28 – uji coba membuktikan proses dequeue benar-benar di
persiapkan dengan baik untuk mengantisipasi queue yang kosong

Gambar 29 – Uji coba input data, untuk membuktikan bahwa setelah queue mengalami
circular array dan dikosong, maka input data mulai dari offset array 0

50
Gambar 30 – tampikan isinya untuk mebuktikan bahwa setelah queue
dikosongkan, data pertama benar-benar dimulai dari offset 0

Gambar 31 – Keluar dari program

51
2.4 Queue Menggunakan Linked List
Selain menggunakan array, queue juga dapat dibuat dengan linked list. Metode linked list yang
digunakan adalah single linked list dan double linked list. Namun dalam laporan kali ini, saya akan
menggunakan single linked list. Berikut adalah beberapa operasi yang ada dalam queue dengan linked
list.

Konstruktor, berguna untuk menciptakan queue yang baru dan kosong, yaitu dengan mengarahkan
pointer fronts dan tail kepada NULL.

IsEmpty, fungsi IsEmpty berguna untuk mengecek apakah queue masih kosong atau sudah berisi data.
Hal ini dilakukan dengan mengecek apakah fronts dan rear masih menreferensi pada NULL atau tidak.
Jika benar berarti queue masih kosong.

Enqueue, operasi ini digunakan untuk menambahkan elemen ke dalam sebuah queue dengan cara
membuat suatu node baru. Apabila fronts dan rear dalam keadaan NULL, maka keduanya kan
menreferensi pada node dari elemen tersebut. Namun bila fronts dan rear tidak dalam keadaan NULL,
maka rear akan membuat node referensinya menunjuk pada node dari elemen baru tersebut, kemudian
rear akan menreferensi kepada node elemen tersebut.

52
Dequeue, berguna untuk mengeluarkan sebuah elemen terdepan dari queue. Hal ini dilakukan dengan
cara menghapus satu node yang terletak paling depan (fronts). Apabila queue kosong, maka dequeue
tidak dapat dilakukan.

FirstEl, berguna untuk menampilkan elemen pertama/terdepan dalam suatu antrian.

Clear, berfungsi untuk mengosongkan isi dari queue dengan cara mengeset nilai dari fronts dan rear
menjadi menreferensi pada NULL untuk asumsi bahwa queue telah kosong.

53
2.4.1 Pembahasan Soal 4 – Implementasi Queue dengan Linked List
Buatlah sebuah program untuk mengimplementasikan queue dan operasi-operasinya dengan linked list.
Buatlah function-function isEmpty(), Clear(), enqueue (el), dequeue() dan firstEl() untuk
mengimplementasikan operasi-operasi queue, kemudian implementasikan untuk membuat aplikasi
queue seperti contoh. Menu dan definisi operasi sesuai dengan soal 3.

Jawaban:
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#define batas "==========================================\n"
using namespace std;

struct Queue {
int data;
Queue* link;
};

struct Queue* fronts = NULL;


struct Queue* rear = NULL;

bool Kosong() {
if (fronts == NULL && rear == NULL) {
return true;
}
else {
return false;
}
}

void menu();
void Enqueue(int El);
void Dequeue();
void FirstEl();
void Clear();
void IsEmpty();
void Show();

void PressAnyKey();

int main() {

menu();

return 0;
}

void menu() {

char Pilihan;
int El;
do {
system("cls");
cout << batas;
cout << " Program Struktur Data " << endl;
cout << " Queue Dengan Linked List " << endl;
cout << "-------------------Menu-------------------" << endl;
cout << "1. Tambah Data ke Queue" << endl;
cout << "2. Keluarkan Data dari Queue" << endl;
cout << "3. Tampilkan Data Teratas pada Queue" << endl;
cout << "4. Bersihkan Queue" << endl;
cout << "5. Check Queue Apakah Queue Kosong" << endl;
cout << "6. Tampilkan Isi Queue" << endl;

54
cout << "0. Keluar" << endl;
cout << endl;
cout << batas;
cout << "Pilihan : ";
cin >> Pilihan;
cout << endl;

switch (Pilihan) {

case '1': {
int i = 1;
cout << "Input Data, untuk mengakhiri dengan 0" << endl;
do {
while (true) {
cout << "Input Data ke " << i << " : ";
cin >> El;
if (cin.fail()) {
cin.clear();
cin.ignore(1000, '\n');
continue;
}
else {
break;
}
}
cout << endl;
if (El == 0) {
break;
}
else {
Enqueue(El);
i++;
}

} while (true);
PressAnyKey();
break;
}

case '2': {
Dequeue();
break;
}

case '3': {
FirstEl();
break;
}

case '4': {
Clear();
break;
}

case '5': {
IsEmpty();
break;
}

case '6': {
Show();
break;
}

case '0': {
cout << "Terima Kasih...." << endl;
exit(0);
}

55
default: {
cout << "Pilihan Tidak Tersedia, Silahkan Pilih Pilihan yang Tersedia
[1-6]" << endl << endl;
}

} while (true);

void Enqueue(int El) {


Queue* temp = new Queue;
temp->data = El;
temp->link = NULL;

if (fronts == NULL && rear == NULL) {


fronts = rear = temp;
}
else {
rear->link = temp;
rear = temp;
}
}

void Dequeue() {

if (Kosong()) {
cout << "Tidak Bisa Mengeluarkan Data Queue, Karena Queue Tidak Memiliki Data"
<< endl;
}
else if (fronts == rear) {
Queue* temp = fronts;
cout << "Data yang di Dequeue : " << temp->data << endl;
fronts = rear = NULL;
temp = NULL;
delete temp;
}
else {
Queue* temp = fronts;
cout << "Data yang di Dequeue : " << temp->data << endl;
fronts = fronts->link;
temp = NULL;
delete temp;
}
PressAnyKey();
}

void FirstEl() {

if (Kosong()) {
cout << "Tidak Bisa Menampilkan Data First Queue, Karena Queue Tidak Memiliki
Data" << endl;
}
else {
cout << "Data Yang Ada Pada First Queue : " << fronts->data << endl;
}
PressAnyKey();
}

void Clear() {
if (Kosong()) {
cout << "Tidak Bisa Mengosongkan Data Queue, Karena Queue Tidak Memiliki Data"
<< endl;
}

56
else {
fronts = rear = NULL;
cout << "Queue Sudah Dibersikan" << endl;
}
PressAnyKey();
}

void IsEmpty() {

if (Kosong()) {
cout << "Queue Kosong" << endl;
}
else {
cout << "Queue Ada Isinya" << endl;
}
PressAnyKey();
}

void Show() {

if (Kosong()) {
cout << "Tidak Bisa Menampilkan Data Queue, Karena Queue Tidak Memiliki Data"
<< endl;
}
else {
if (fronts->link == NULL) {
cout << "Isi Queue" << endl;
cout << fronts->data << endl;
}
else {
cout << "Isi Queue" << endl;
Queue* temp = fronts->link;
cout << fronts->data;
while (temp != NULL) {
cout << "->";
cout << temp->data;
temp = temp->link;
}
}
}
cout << endl;
PressAnyKey();
}

void PressAnyKey() {
cout << "Tekan Sembarang Tombol untuk Melanjutkan!!! ";
getch();
cout << endl << endl;
}

57
Screen Captures Pengujian Program

Gambar 1- menu

Gambar 2 -Input Data Queue dengan Linked List

58
Gambar 3 - Tampilan (Menampilkan Isi Queue Dengan Linked List)

Gambar 4 - Ujicoba Operasi FirstEl pada Queue dengan Linked List

59
Gambar 5 - Tampilan (Menampilkan Isi Queue setelah Operasi FirstEl)

Gambar 6 - Percobaan Dequeue

60
Gambar 7 - Menampilkan isi Queue setelah Dequeue

Gambar 8 - Menampilkan Apakah Queue Kosong

61
Gambar 9 - Mengosongkan isi Queue

Gambar 10 - Mengecek Apakah Queue Kosong

62
Kesimpulan
Berdasarkan pembahasan dalam laporan kali ini, dapat disimpulkan bahwa terdapat beberapa
teknik yang dapat dilakukan dalam struktur data. Dan dua diantaranya dibahas dalam laporan kali ini
dengan menggunakan array dan linked list (tipe data abstrak). Terdapat kelebihan dan kekurangan pada
masing dapat kita lihat melalui laporan ini. Materi ini menurut saya sangat penting untuk dipahami,
sebab penggunaanya akan sangat diperlukan pada materi berikutnya.

Sebagai penutup saya mengucapkan terima kasih atas tugas yang diberikan, sehingga dapat
menambah wawasan saya lebih jauh lagi mengenai Stack dan Queue dengan implementasinya
menggunakan array dan linked list. Akhir kata saya meminta maaf sebesar-besarnya apabila terdapat
kesalahan kalimat maupun pemahaman.

63

Anda mungkin juga menyukai