Struktur Data
Materi :
Dosen Pengajar:
Disusun Oleh:
Nama: Fendyanto
NIM: 31190038
2020 – 2021
DAFTAR ISI
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.
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).
Ada dua cara penerapan prinsp stack, yakni dengan array dan linked list. Berikut merupakan
beberapa operasi yang setidaknya harus ada dalam penggunaan stack.
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;
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;
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;
}
}
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
8
Gambar 3 – Uji Coba isEmpty()stacks
9
Gambar 5 – Uji coba operasi topEl()
10
Gambar 7 – uji coba operasi pop()
11
Gambar 9 – uji coba pop() kedua
12
Gambar 11 – isi stacks setelah di pop 3 kali sisa dua data
13
Gambar 13 – check isi stacks setelah dikosongkan
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;
};
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;
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 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;
}
void PressAnyKey() {
cout << "Tekan Sembarang Tombol untuk Melanjutkan!!! ";
getch();
cout << endl << endl;
}
20
Gambar 2 – Percobaan Input Data pada Stacks
21
Gambar 4 – Lihat isi Stacks setelah diinputkan pertama kali
22
Gambar 6 –isi stacks setelah di tampikan dengan topEl() tidak berubah
23
Gambar 8 – isi stack setelah di pop() berubah
24
Gambar 10 – uji coba pop() ketiga
25
Gambar 12 – Uji coba membersihkan stacks
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).
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.
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.
30
Clear, berfungsi untuk mengosongkan isi dari queue dengan cara mengeset nilai dari fronts dan rear
menjadi -1 untuk asumsi bahwa queue telah kosong.
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;
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);
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) {
}
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;
}
35
Gambar 2 – uji coba mengisi data pada queue dengan circular array
36
Gambar 3 – tampilkan isi queue
37
Gambar 5 – isi queue setelah di operasikan dengan firstEl() tidak berubah
38
Gambar 7 – isi queue setelah operasi dequeue() berubah
39
Gambar 9 – dequeue() ketiga
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
44
Gambar 18 – tampilkan isi queque untuk membuktikan bahwa dequeue()
pada array yang sudah mengalami Circular tetap berjalan dengan baik
45
Gambar 20 - lakukan dequeue ke-8 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
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
48
Gambar 26 – Uji coba membersihkan queue
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
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.
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;
};
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 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
58
Gambar 3 - Tampilan (Menampilkan Isi Queue Dengan Linked List)
59
Gambar 5 - Tampilan (Menampilkan Isi Queue setelah Operasi FirstEl)
60
Gambar 7 - Menampilkan isi Queue setelah Dequeue
61
Gambar 9 - Mengosongkan isi Queue
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