Anda di halaman 1dari 12

Fakultas Teknologi Komunikasi dan Informatika

DASAR PEMROGRAMAN
Modul 11 – Implementasi Stack
WINARSIH, S.Si., MMSI

2022

Universitas Nasional
Stack Dengan Link List
Implementasi Aplikasi Linked List untuk membuat tumpukan (Stack)

// Implementasi kelas SimpulTumpukan dan ListTumpukan


// (Aplikasi untuk membalik string)

#pragma hdrstop
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
class SimpulTumpukan
{
public:
char data;
SimpulTumpukan* berikut;

// Konstruktor
SimpulTumpukan(char data);
};

class ListTumpukan
{
private:
SimpulTumpukan* puncak;
public:
ListTumpukan();
virtual ~ListTumpukan();
void push(char data);
bool empty();
char pop();
};

// Konstruktor
SimpulTumpukan::SimpulTumpukan(char data)
{
SimpulTumpukan::data = data;
SimpulTumpukan::berikut = NULL;
}

ListTumpukan::ListTumpukan()
{
ListTumpukan::puncak = NULL;
}

2022 Dasar Pemrograman


1 Winarsih, S.Si., MMSI
// Destruktor
ListTumpukan::~ListTumpukan()
{
// Menghapus semua simpul
SimpulTumpukan* penunjukHapus;
while (puncak != NULL)
{
penunjukHapus = puncak;
puncak = puncak->berikut;
delete penunjukHapus;
}
}

// push() (Bersifat publik)


// Untuk memasukkan data ke dalam tumpukan

void ListTumpukan::push(char data)


{
SimpulTumpukan* ptrBaru;

ptrBaru = new SimpulTumpukan(data);


ptrBaru->berikut = puncak;
puncak = ptrBaru;
}

// empty() (Bersifat publik)


// Menghasilkan true kalau tumpukan dalam keadaan kosong

bool ListTumpukan::empty()
{
return puncak == NULL;
}

// pop() (Bersifat publik)


// Mengambil sebuah nilai dari tumpukan
char ListTumpukan::pop()
{
if (empty())
{
cout << "Tumpukan sudah kosong. "
<< "Tidak bisa diambil lagi" << endl;
return 0; // Karakter NULL menyatakan tumpukan sudah kosong
}

SimpulTumpukan* ptrData;
char data;

2022 Dasar Pemrograman


2 Winarsih, S.Si., MMSI
ptrData = puncak;
data = puncak->data;
puncak = puncak->berikut;
delete ptrData;
return data;
}
int main()
{
ListTumpukan tumpukan;
tumpukan.push('A');
tumpukan.push('B');
tumpukan.push('C');
tumpukan.push('D');

// Ambil isi tumpukan


cout << "Isi tumpukan dari atas ke bawah:" << endl;
char karakter;
while (! tumpukan.empty())
{
karakter = tumpukan.pop();
cout << karakter << endl;
}

getch();
}

Hasil running :

2022 Dasar Pemrograman


3 Winarsih, S.Si., MMSI
APLIKASI DOUBLE LINKED LIST

Double Linked List adalah jenis linked list yang memiliki 2 buah pointer. Pointer

pertama dipakai untuk menunjuk ke simpul berikutnya dan pointer kedua

digunakan untuk menunjuk ke simpul pendahulunya.

// Contoh untuk menguji senarai berantai ganda


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

class SimpulGanda
{
public:
char data;
SimpulGanda* berikut;
SimpulGanda* sebelum;
// Konstruktor
SimpulGanda(char data);
};
class ListGanda
{
private:
SimpulGanda* pertama;
SimpulGanda* terakhir;
public:
ListGanda();
virtual ~ListGanda();
void insertFirst(char data);
void insertLast(char data);
bool insertAfter(char kunci, char data);
bool empty();
char removeFirst();
char removeLast();
bool removeKey(char data);
void displayForward();
void displayBackward();
};
// Konstruktor
SimpulGanda::SimpulGanda(char data)
{
// Konstruktor
SimpulGanda::data = data;
SimpulGanda::berikut = NULL;

2022 Dasar Pemrograman


4 Winarsih, S.Si., MMSI
SimpulGanda::sebelum = NULL;
}
// Konstruktor
ListGanda::ListGanda()
{
// Konstruktor
ListGanda::pertama = NULL;
ListGanda::terakhir = NULL;
}
// Destruktor
ListGanda::~ListGanda()
{
// Destruktor
// Menghapus semua simpul
SimpulGanda* penunjukHapus;
while (pertama != NULL)
{
penunjukHapus = pertama;
pertama = pertama->berikut;
delete penunjukHapus;
}
}
// insertFirst() (Bersifat publik)
// Menyisipkan data ke dalam senarai
// sehingga akan ditunjuk oleh pertama
void ListGanda::insertFirst(char data)
{
// Buat simpul baru dan isikan Karakter ke dalam simpul
SimpulGanda* ptrBaru = new SimpulGanda(data);
// Atur penunjuk ke simpul
if (empty())
terakhir = ptrBaru;
else
pertama->sebelum = ptrBaru;
ptrBaru->berikut = pertama;
ptrBaru->sebelum = NULL;
pertama = ptrBaru;
}
// insertLast() (Bersifat publik)
// Menyisipkan data ke akhir senarai
void ListGanda::insertLast(char data)
{
// Buat simpul baru dan isikan karakter ke dalam simpul
SimpulGanda* ptrBaru = new SimpulGanda(data);
// Atur penunjuk ke simpul
if (empty())

2022 Dasar Pemrograman


5 Winarsih, S.Si., MMSI
pertama = ptrBaru;
else
{
terakhir->berikut = ptrBaru;
ptrBaru->sebelum = terakhir;
}
ptrBaru->berikut = NULL;
terakhir = ptrBaru;
}
// insertAfter() (Bersifat publik)
// Menyisipkan data ke sesudah kunci kunci
bool ListGanda::insertAfter(char kunci, char data)
{
char ditemukan = false;
// Cari posisi Key
SimpulGanda* ptrData = pertama;
while (ptrData != NULL)
{
if (ptrData->data == kunci)
{
ditemukan = true;
break;
}
ptrData = ptrData->berikut;
}
// Cek kalau tidak ditemukan
if (! ditemukan)
{
return false;
}
// Buat simpul baru dan isikan data ke dalam simpul
SimpulGanda* ptrBaru = new SimpulGanda(data);
// Atur penunjuk ke simpul
if (ptrData == terakhir)
{
ptrBaru->berikut = NULL;
terakhir = ptrBaru;
}
else
{
ptrBaru->berikut = ptrData->berikut;
ptrData->berikut->sebelum = ptrBaru;
}
ptrBaru->sebelum = ptrData;
ptrData->berikut = ptrBaru;
return true;

2022 Dasar Pemrograman


6 Winarsih, S.Si., MMSI
}
// empty() (Bersifat publik)
// Menghasilkan true kalau senarai kosong atau false kalau tidak kosong
bool ListGanda::empty()
{
return pertama == NULL;
}
// removeFirst() (Bersifat publik)
// Menghapus data pada simpul yang ditunjuk oleh pertama
char ListGanda::removeFirst()
{
if (empty())
{
cout << "Tumpukan sudah kosong" << endl;
return 0;
}
char data = pertama->data;
SimpulGanda* ptrData = pertama;
if (pertama->berikut == NULL)
terakhir = NULL;
else
pertama->berikut->sebelum = NULL;
pertama = pertama->berikut;
delete ptrData;
return data;
}
// removeLast() (Bersifat publik)
// Menghapus data pada simpul yang ditunjuk oleh terakhir
char ListGanda::removeLast()
{
if (empty())
{
cout << "Tumpukan sudah kosong" << endl;
return 0;
}
char data = terakhir->data;
SimpulGanda* ptrData = terakhir;
if (pertama->berikut == NULL)
pertama = NULL;
else
terakhir->sebelum->berikut = NULL;

terakhir = terakhir->sebelum;
delete ptrData;
return data;
}

2022 Dasar Pemrograman


7 Winarsih, S.Si., MMSI
// removeKey() (Bersifat publik)
// Menghapus simpul yang sesuai dengan kunci
// Hasil true kalau data dihapus false kalau tak ada yang dihapus
bool ListGanda::removeKey(char data)
{
SimpulGanda* ptrData = pertama;
while (ptrData->data != data)
{
ptrData = ptrData->berikut;
if (ptrData == NULL)
{
return false;
}
}
if (ptrData == pertama)
pertama = ptrData->berikut;
else
ptrData->sebelum->berikut = ptrData->berikut;
if (ptrData == terakhir)
terakhir = ptrData->sebelum;
else
ptrData->berikut->sebelum = ptrData->sebelum;
delete ptrData;
return true;
}
// displayForward() (Bersifat publik)
// Menampilkan isi senarai dari pertama ke terakhir
void ListGanda::displayForward()
{
cout << "Dari pertama ke terakhir: " << endl;
SimpulGanda* ptrData = pertama;
while (ptrData != NULL)
{
cout << ptrData->data;
ptrData = ptrData->berikut;
}
cout << endl; // Pindah baris
}
// displayBackward() (Bersifat publik)
// Menampilkan isi senarai dari terakhir ke pertama
void ListGanda::displayBackward()
{
cout << "Dari terakhir ke pertama: " << endl;
SimpulGanda* ptrData = terakhir;
while (ptrData != NULL)
{

2022 Dasar Pemrograman


8 Winarsih, S.Si., MMSI
cout << ptrData->data;
ptrData = ptrData->sebelum;
}
cout << endl; // Pindah baris
}
int main()
{
ListGanda senarai;
senarai.insertFirst('A');
senarai.insertFirst('B');
senarai.insertFirst('C');
senarai.insertFirst('D');
senarai.insertFirst('E');
senarai.displayForward();
cout << "Penyisipan X dan Y: " << endl;
senarai.insertLast('X');
senarai.insertLast('Y');
senarai.displayBackward();
senarai.displayForward();

char karakter = senarai.removeFirst();


cout << "Karakter terkiri yang diambil: " << endl;
senarai.displayForward();

senarai.removeKey('C');
cout << "Setelah C diambil:" << endl;
senarai.displayForward();

karakter = senarai.removeLast();
cout << "Karakter terkanan yang diambil: " << endl;
senarai.displayForward();

cout << "Penyisipan setelah B: " << endl;


senarai.insertAfter('B', 'M');
senarai.displayForward();

getch();
}

2022 Dasar Pemrograman


9 Winarsih, S.Si., MMSI
Hasil running :

2022 Dasar Pemrograman


10 Winarsih, S.Si., MMSI
Daftar Pustaka
1. Handout Algoritma Pemrograman Dan Struktur Data Program Studi Sistem Informasi
UKDW
2. Antony Pranata, Algoritma dan Pemrograman, J & J Learning, Yogyakarta, 2000
3. Rinaldi Munir, Algoritma & Pemrograman Dalam Bahasa Pascal dan C, Informatika
Bandung, 2007.
4. Elvina S. Kom, MM, Modul Perkuliahan Universitas Mercu Buana, 2015
5. Suryadi H.S., Agus Sumin, Pengantar Algoritma dan Pemrograman Teknik Diagram
Alur dan Bahasa Basic Dasar, Gunadarma, 1993
6. M. Fachrurrozi, MODUL PRAKTIKUM “STRUKTUR DATA”, LABORATORIUM DASAR
KOMPUTER PROGRAM ILMU KOMPUTER UNIVERSITAS SRIWIJAYA 2006

2022 Dasar Pemrograman


11 Winarsih, S.Si., MMSI

Anda mungkin juga menyukai