Anda di halaman 1dari 25

LAPORAN PRAKTIKUM STRUKTUR DATA

MODUL V : STACK

Disusun Oleh:
Nama : Febri Yolanda Silalahi
NIM : 21103016
Kelas : S1SI 05-A

PROGRAM STUDI S1 SISTEM INFORMASI


FAKULTAS INFORMATIKA
INSTITUT TEKNOLOGI TELKOM PURWOKERTO
PURWOKERTO
2022
DASAR TEORI

Stack adalah salah satu komponen yang biasanya digunakan dalam pemrograman ataupun
penyimpanan komputer.
Bagi orang yang dekat dengan dunia IT, stack mungkin menjadi istilah yang sudah familiar.
Tak bisa dimungkiri, stack membuat penggunanya menjadi mudah dalam mengorganisasi data.
Lalu, sebenarnya apa itu stack? Apa saja kelebihan dan kekurangan saat menggunakannya?
Tenang saja, dalam artikel ini Glints akan menjelaskannya kepadamu.
Karakteristik penting stack adalah bersifat LIFO (Last In First Out) artinya data yang terakhir
masuk merupakan data yang akan keluar terlebih dahulu. Saya yakin teman-teman dapat
menyimpulkan maksudnya. Kita asumsikan saja misalnya saya memasukkan data alfabet secara
urut dari a sampai e (a-b-c-d-e). Kemudian saya ingin mengeluarkan alfabet b, maka saya harus
mengeluarkan alfabet e, d dan c secara berurut hingga akhirnya saya dapat mengakses b. Sangat
sederhana.
Posisi/letak data pada suatu stack ditandai dengan indeks yang dimulai dari 0. Semisal pada stack
terdapat satu data maka data tersebut terdapat pada indeks 0, sehingga jika stack masih kosong,
belum memiliki data sama sekali maka dapat dikatakan indeks matriks tersebut -1 (minus satu).
Ukuran stack memiliki batasan atau maksimal jumlah data yang tertumpuk, biasanya ditetapkan
saat awal pembuatan/deklarasi stack.
Keadaan awal ketika pertama kali stack/tumpukan dibuat/dideklarasikan sebaiknya nilai indeks
awal dalam hal ini variabel posisi diisi dengan nilai -1 (minus 1), hal ini untuk menunjukkan jika
tumpukan/stack masih kosong belum ada data sama sekali. Dalam praktik disini untuk proses
inisialisasi nilai posisi dibuat dalam sebuah fungsi (prosedur) dengan nama posisi_awal yang
akan dipanggil pada fungsi main atau fungsi lainnya.
Kelebihan dan Kekurangan Menggunakan Stack
1. Kelebihan
✓ membantu mengelola data dengan metode LIFO
✓ secara otomatis membersihkan objek
✓ tidak mudah rusak
✓ ukuran variabel tidak dapat diubah
✓ mengontrol memori secara mandiri
2. Kekurangan
✓ memori stack sangat terbatas
✓ ada kemungkinan stack akan meluap atau overflow jika terlalu banyak objek
✓ tidak memungkinkan akses acak, karena harus mengeluarkan tumpukan paling atas
terlebih dahulu untuk mengakses tumpukan paling bawah
GUIDED

1. Latihan 1
Buatlah program utuh yang menerapkan struktur data stack, yang memiliki pilihan utama tambah
data, hapus data, dan tampil data.
Source Code
#include <iostream>
#include <windows.h>

using namespace std;

const int maksimal_tumpukan = 10;


bool keluar = false;
char ya_tidak;
int pilihan;
string data_masuk;

struct tumpukan{
int posisi;
string data[maksimal_tumpukan];
};
tumpukan buku;
void inisialisasi(){
buku.posisi = -1;
}
bool kosong(){
if(buku.posisi == -1){
return true;
}else{
return false;
}
}
bool penuh(){
if(buku.posisi == maksimal_tumpukan - 1){
return true;
}else{
return false;
}
}
void push_tumpukan(string data_masukkan){
if(kosong() == true){
buku.posisi++;
buku.data[buku.posisi] = data_masukkan;
cout<<"Berhasil memasukkan : "<<data_masukkan<<endl;
}else if(penuh() == false){
buku.posisi++;
buku.data[buku.posisi] = data_masukkan;
cout<<"Berhasil memasukkan : "<<data_masukkan<<endl;
}else{
cout<<"Tumpukan sudah penuh"<<endl;
}
}
void pop_tumpukan(){
if(kosong() == true){
cout<<"Tumpukan kosong"<<endl;
}else{
buku.posisi--;
cout<<"Data berhasil dihapus"<<endl;
}
}
void tampil_data(){
if(kosong() == true){
cout<<"Tidak ada data"<<endl;
}else{
for(int c = buku.posisi; c >= 0; c--){
cout<<buku.data[c]<<endl;
}
}
}
int main()
{
inisialisasi();
do{
cout<<"\t"<<"Stack Apps"<<endl;
cout<<"1. Masukkan data kedalam Stack"<<endl;
cout<<"2. Hapus data dari Stack"<<endl;
cout<<"3. Tampilkan data Stack"<<endl;
cout<<"4. Keluar"<<endl;
cout<<"Silahkan pilih (1-4) : ";
cin>>pilihan;
switch(pilihan){
case 1 :
cout<<"Silahkan masukkan data : ";
cin>>data_masuk;
push_tumpukan(data_masuk);
cout<<"Keluar (y/t) ? ";
cin>>ya_tidak;
if(ya_tidak == 'y' || ya_tidak == 'Y'){
cout<<" Jumpa kembali "<<endl;
keluar = true;
}else{
system("cls");
}
break;
case 2 :
pop_tumpukan();
cout<<"Keluar (y/t) ? ";
cin>>ya_tidak;
if(ya_tidak == 'y' || ya_tidak == 'Y'){
cout<<" Terima kasih"<<endl;
keluar = true;
}else{
system("cls");
}
break;
case 3 :
tampil_data();
cout<<"Keluar (y/t) ? ";
cin>>ya_tidak;
if(ya_tidak == 'y' || ya_tidak == 'Y'){
cout<<" Terima kasih"<<endl;
keluar = true;
}else{
system("cls");
}
break;
case 4 :
cout<<"Yakin ingin keluar (y/t) ? ";
cin>>ya_tidak;
if(ya_tidak == 'y' || ya_tidak == 'Y'){
cout<<" Terima kasih"<<endl;
keluar = true;
}
system("cls");
break;
default :
cout<<"Pilihan tidak tersedia..."<<endl;
cout<<"Keluar (y/t) ? ";
cin>>ya_tidak;
if(ya_tidak == 'y' || ya_tidak == 'Y'){
cout<<" Terima kasih"<<endl;
keluar = true;
}else{
system("cls");
}
}
}while(keluar == false);
return 0;
}

Running Program
2. Latihan 2
Tulis dan jalankan sintak program dibawah, kemudian lakukan analisa.
Source Code
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <ctype.h>

using namespace std;

void push_data(char huruf);


char pop_data();
char tumpukan[100];
int posisi = -1;

int main(){
char kata[100];
int i, panjang, penghitung = 0;
cout<<"Masukkan sebuah kata (akhiri dengan enter): ";
gets(kata);
panjang = strlen(kata);
for(i = 0; i < panjang; i++){
push_data(tolower(kata[i]));
}
for(i = 0; i < panjang; i++){
if(tolower(kata[i]) == pop_data()){
penghitung++;
}
}
if(penghitung == panjang){
cout<< kata <<" adalah palindrom"<<endl;
}else{
cout<< kata <<" bukan palindrom"<<endl;
}
return 0;
}

void push_data(char huruf){


tumpukan[++posisi] = huruf;
}
char pop_data(){
return tumpukan[posisi--];
}
Running Program

Penjelasan:
= Program untuk menganalisa untuk menentukan apakah data yang dimasukkan merupakan palindrom
atau bukan. Palindrom merupakan , kata yang jika kita balik, pembacaan kata.
UNGUIDED

1. Latihan 1
Modifikasi tugas guided 1, sehingga tumpukan dapat menyimpan data buku yang terdiri dari
JUDUL_BUKU, PENGARANG, JUMLAH_HALAMAN, dan HARGA.
Sourcw Code
#include <iostream>
#include <windows.h>

using namespace std;

const int maksimal_tumpukan1 = 50;


const int maksimal_tumpukan2 = 50;
const int maksimal_tumpukan3 = 50;
const int maksimal_tumpukan4 = 50;

bool keluar = false;


char ya_tidak;
int pilihan;
string jubuk1;
string pengarang1;
int jumhal1;
int harga1;

struct buku{
int posisi1,posisi2,posisi3,posisi4;
string judul_buku[maksimal_tumpukan1],pengarang[maksimal_tumpukan2];
int jumlah_halaman[maksimal_tumpukan3],harga[maksimal_tumpukan4];
};
buku febri;
void inisialisasi(){
febri.posisi1 = -1;
febri.posisi2 = -1;
febri.posisi3 = -1;
febri.posisi4 = -1;
}
bool kosong(){
if(febri.posisi1 == -1){
return true;
}else if(febri.posisi2 == -1){
return true;
}else if(febri.posisi3 == -1){
return true;
}else if(febri.posisi4 == -1){
return true;
}else{
return false;
}
}
bool penuh(){
if(febri.posisi1 == maksimal_tumpukan1 - 1){
return true;
}else if(febri.posisi2 == maksimal_tumpukan2 - 1){
return true;
}else if(febri.posisi3 == maksimal_tumpukan3 - 1){
return true;
}else if(febri.posisi4 == maksimal_tumpukan4 - 1){
return true;
}else{
return false;
}
}
void push_tumpukan(string jubuk, string pengarang, int jumhal, int harga){
if(kosong() == true){
febri.posisi1++;
febri.posisi2++;
febri.posisi3++;
febri.posisi4++;
febri.judul_buku[febri.posisi1] = jubuk;
febri.pengarang[febri.posisi2] = pengarang;
febri.jumlah_halaman[febri.posisi3] = jumhal;
febri.harga[febri.posisi4] = harga;
cout<<"Berhasil memasukkan judul buku : "<<jubuk<<endl;
cout<<"Berhasil memasukkan pengarang : "<<pengarang<<endl;
cout<<"Berhasil memasukkan jumlah halaman : "<<jumhal<<endl;
cout<<"Berhasil memasukkan harga buku : "<<harga<<endl;
}else if(penuh() == false){
febri.posisi1++;
febri.posisi2++;
febri.posisi3++;
febri.posisi4++;
febri.judul_buku[febri.posisi1] = jubuk;
febri.pengarang[febri.posisi2] = pengarang;
febri.jumlah_halaman[febri.posisi3] = jumhal;
febri.harga[febri.posisi4] = harga;
cout<<"Berhasil memasukkan judul buku : "<<jubuk<<endl;
cout<<"Berhasil memasukkan pengarang : "<<pengarang<<endl;
cout<<"Berhasil memasukkan jumlah halaman : "<<jumhal<<endl;
cout<<"Berhasil memasukkan harga buku : "<<harga<<endl;
}else{
cout<<"Tumpukan sudah penuh"<<endl;
}
}
void pop_tumpukan(){
if(kosong() == true){
cout<<"Tumpukan kosong"<<endl;
}else{
febri.posisi1--;
febri.posisi2--;
febri.posisi3--;
febri.posisi4--;
cout<<"Data berhasil dihapus"<<endl;
}
}
void tampil_data(){
if(kosong() == true){
cout<<"Tidak ada data"<<endl;
}else if(kosong()==false){
for(int c = febri.posisi1; c >= 0; c--){
cout<<febri.judul_buku[c]<<endl;
}
for(int c = febri.posisi2; c >= 0; c--){
cout<<febri.pengarang[c]<<endl;
}
for(int c = febri.posisi3; c >= 0; c--){
cout<<febri.jumlah_halaman[c]<<endl;
}
for(int c = febri.posisi4; c >= 0; c--){
cout<<febri.harga[c]<<endl;
}
}
}
int main()
{
inisialisasi();
do{
cout<<endl;
cout<<"\t"<<"== Stack Apps =="<<endl<<endl;
cout<<"1. Masukkan data kedalam Stack"<<endl;
cout<<"2. Hapus data dari Stack"<<endl;
cout<<"3. Tampilkan data Stack"<<endl;
cout<<"4. Keluar"<<endl<<endl;
cout<<"Silahkan Masukkan Pilihan (1-4) : ";
cin>>pilihan;
cout<<endl;
switch(pilihan){
case 1 :
cout<<"Silahkan masukkan nama buku : ";
cin>>jubuk1;
cout<<"Silahkan masukkan nama pengarang : ";
cin>>pengarang1;
cout<<"Silahkan masukkan jumlah halaman : ";
cin>>jumhal1;
cout<<"Silahkan masukkan harga buku : ";
cin>>harga1;
push_tumpukan(jubuk1,pengarang1,jumhal1,harga1);
cout<<"Keluar (y/t) ? ";
cin>>ya_tidak;
if(ya_tidak == 'y' || ya_tidak == 'Y'){
cout<<" Jumpa kembali "<<endl;
keluar = true;
}else{
system("cls");
}
break;
case 2 :
pop_tumpukan();
cout<<"Keluar (y/t) ? ";
cin>>ya_tidak;
if(ya_tidak == 'y' || ya_tidak == 'Y'){
cout<<" Jumpa kembali "<<endl;
keluar = true;
}else{
system("cls");
}
break;
case 3 :
tampil_data();
cout<<"Keluar (y/t) ? ";
cin>>ya_tidak;
if(ya_tidak == 'y' || ya_tidak == 'Y'){
cout<<" Jumpa kembali "<<endl;
keluar = true;
}else{
system("cls");
}
break;
case 4 :
cout<<"Keluar (y/t) ? ";
cin>>ya_tidak;
if(ya_tidak == 'y' || ya_tidak == 'Y'){
cout<<" Jumpa kembali "<<endl;
keluar = true;
}else{
system("cls");
}
break;
default :
cout<<"Pilihan tidak tersedia..."<<endl;
cout<<"Keluar (y/t) ? ";
cin>>ya_tidak;
if(ya_tidak == 'y' || ya_tidak == 'Y'){
cout<<" Terima kasih"<<endl; keluar = true;
}else{
system("cls");
}
}
}while(keluar == false);
return 0;
}

Running Program
Penjelasan unguided 1:
Dari soal unguided 1 diatas kita bisa menampilkan identitas dari suatu buku, yaitu mulai dari
judul buku, pengarang buku, tebal halaman buku, dan harga buku. Kita bisa menampilkan
identias buku lebih dari satu dengan menggunakan stack.
Misal kita ingin membuat 2 identitas buku. Kita hanya perlu mengetik atau mengisi dari identitas
buku tersebut. Hasil atau outputnya akan keluar karena kita menggunakan stack.
Langkah-langkah nya yaitu:
1. buat const int tumpukan maksimal
2. buat tipe data beserta variabel-variabel nya
3. untuk menampilkannya, kita sebaiknya menggunakan fungsi atau prosedur
4. setelah itu, kitab isa membuat perulangan for
5. kita membuat switch case pilihan
6 setelah semuanya selesai, jalankan dan pastikan sintaknya sesuai dan tidak ada yang error.
Dalam runningannya kita disuruh memasukkan pilihan 1-4. Dimana pilihan 1 adalah masukkan
data, pilihan 2 hapus data, pilihan 3 tampilkan data, dan pilihan 4 keluar.
Misal untuk mengisi data, kita mengetik angka 1. Kemudian kita mengisi apa yang diminta.
Mulai dari judul buku, pengarang, tebal halaman, dan harga buku. Setelah semua diisi, maka kita
lanjutkan ke yang selanjutnya. Misal kita ingin membuat satu identitas buku lagi. Kita masukkan
data yang diminta seperti yang sebelumnya. Jika sudah tekan enter.
Jika ingin menampilkan data stack, kita klik angka 3. Maka akan mengeluarkan data buku 1 dan
2, tetapi penampilannya bukan dari buku pertama melainkan pada buku kedua. Semisal pada
buku pertama, kita membuat judul mariposa dan buku kedua kita membuat judul bersamamu,
maka yang keluar adalah bersamamu mariposa.
Untuk pengarang, tebal halaman, dan harga buku juga begitu. Dimulai dari buku kedua bar uke
yang pertama.
Selanjutnya jika kita ingin keluar, kita mengetik angka 4, dan kita akan keluar. Dan juga bisa
langsung mengetik ‘y’ pada pilihan “keluar (y/t)”.
2. Latihan 2
Buatlah program yang menerapkan struktur data stack/tumpukan yang dapat menampilkan hasil
PREFIX dan POSTFIX dari INFIX ungkapan aritmetika :
A*(B+C)/D^E–F
Source Code
#include<iostream>
#include<stack>
#include <algorithm>

using namespace std;

bool Operator(char chr){


if(chr=='+'||chr=='-'||chr=='*'||chr=='/'||chr=='^'){
return true;
}else{
return false;
}
}
int chrUtama_inpost(char chr){
if(chr == '^'){
return 3;
}else if(chr == '*' || chr == '/'){
return 2;
}else if(chr == '+' || chr == '-'){
return 1;
}else{
return -1;
}
}
int chrUtama_inpref(char chr){
if (chr== '^'){
return 3;
}else if (chr == '*' || chr == '/'){
return 2;
}else if (chr == '+' || chr == '-'){
return 1;
}else{
return -1;
}
}
string Infix_Postfix(stack <char> stk, string infix){
string postfix;
for(int i=0;i<infix.length();i++){
if((infix[i] >= 'a' && infix[i] <= 'z')||(infix[i] >= 'A' && infix[i] <= 'Z')){
postfix+=infix[i];
}else if(infix[i] == '('){
stk.push(infix[i]);
}else if(infix[i] == ')'){
while((stk.top()!='(') && (!stk.empty())){
char temp=stk.top();
postfix+=temp;
stk.pop();
}
if(stk.top()=='('){
stk.pop();
}
}else if(Operator(infix[i])){
if(stk.empty()){
stk.push(infix[i]);
}else{
if(chrUtama_inpost(infix[i])>chrUtama_inpost(stk.top())){
stk.push(infix[i]);
}else
if((chrUtama_inpost(infix[i])==chrUtama_inpost(stk.top()))&&(infix[i]=='^')){
stk.push(infix[i]);
}else{
while((!stk.empty())&&( chrUtama_inpost(infix[i])<=chrUtama_inpost(stk.top()))){
postfix+=stk.top();
stk.pop();
}
stk.push(infix[i]);
}
}
}
}
while(!stk.empty()){
postfix+=stk.top();
stk.pop();
}
return postfix;
}
string Infix_Prefix(stack<char> stk, string infix){
string prefix;
reverse(infix.begin(), infix.end());
for (int i = 0; i < infix.length(); i++) {
if (infix[i] == '(') {
infix[i] = ')';
}
else if (infix[i] == ')') {
infix[i] = '(';
}
}
for (int i = 0; i < infix.length(); i++) {
if ((infix[i] >= 'a' && infix[i] <= 'z') || (infix[i] >= 'A' && infix[i] <= 'Z')) {
prefix += infix[i];
}
else if (infix[i] == '(') {
stk.push(infix[i]);
}
else if (infix[i] == ')') {
while ((stk.top() != '(') && (!stk.empty())) {
prefix += stk.top();
stk.pop();
}
if (stk.top() == '(') {
stk.pop();
}
}
else if (Operator(infix[i])) {
if (stk.empty()) {
stk.push(infix[i]);
}
else {
if (chrUtama_inpref(infix[i]) > chrUtama_inpref(stk.top())) {
stk.push(infix[i]);
}
else if ((chrUtama_inpref(infix[i]) == chrUtama_inpref(stk.top()))&& (infix[i] ==
'^')) {
while ((chrUtama_inpref(infix[i]) == chrUtama_inpref(stk.top()))&& (infix[i] ==
'^')) {
prefix += stk.top();
stk.pop();
}
stk.push(infix[i]);
}
else if (chrUtama_inpref(infix[i]) == chrUtama_inpref(stk.top())) {
stk.push(infix[i]);
}
else {
while ((!stk.empty()) && (chrUtama_inpref(infix[i]) <
chrUtama_inpref(stk.top()))) {
prefix += stk.top();
stk.pop();
}
stk.push(infix[i]);
}
}
}
}
while (!stk.empty()) {
prefix += stk.top();
stk.pop();
}
reverse(prefix.begin(), prefix.end());
return prefix;
}
int main(){
string infix_exp, postfix_exp,prefix_exp;
cout<<"Masukkan ungkapan Infix : ";
cin>>infix_exp;
stack <char> stack;
cout<<"Ungkapan infix: "<<infix_exp<<endl;
cout<<endl;
postfix_exp = Infix_Postfix(stack, infix_exp);
prefix_exp = Infix_Prefix(stack, infix_exp);
cout<<"Ungkapan Postfix: "<<postfix_exp<<endl;
cout<<"Ungkapan Prifix : "<<prefix_exp<<endl;
return 0;
}

Running Program
Penjelasan unguided 2
Dari soal diatas dijelaskan bahwa untuk mencari hasil dari aritmatika, yaitu infix, prefix, postfix
bisa kita terapkan dalam pemrograman.
Adapun rumus-rumusnya seperti pada sintak diatas.
Cara membuat / menerapkan aritmatika infix, prefix dan postfix ke dalam sintaknya, adalah
sebagai berikut:
1. buat include <algorithm>
2. kita buat bool operator, dalam bool operator buat tipe data dan nama variabel
3. Masukkan operator pangkat ( ^ ), kali ( * ), bagi ( / ), tambah ( + ), dan kurang ( - )
4. kita menggunakan perulangan for
5. ketik return 0; untuk tanda sebagai sintak sudah selesai
Jika sintak / source code program sudah selesai, kita jalankan. Pastikan semua sintak sudah
sesuai dan tidak ada yang error.
Jika sudah, pada runningan program, kitab isa melakukan operasi aritmatika infix, prefix, dan
postfix. Dalam soal kita disuruh mencari prefix dan postfix dari infix :
A*(B+C)/D^E–F
Maka akan prefix nya adalah -/*A+BC^DEF
Dan postfix nya adalah ABC+*DE^/F-
Cara pengerjaan manual:
1. Prefix = A*(B+C)/D^E-F
= A*+BC/D^E-F
= A*+BC/^DE-F
= *A+BC/^DE-F
= /*A+BC^DE-F
= -/*A+BC^DEF
2. Postfix = A*(B+C)/D^E-F
= A*BC+/D^E-F
= A*BC+/DE^-F
= ABC+*/DE^-F
= ABC+*DE^/-F
= ABC+*DE^/F-
PENGALAMAN BELAJAR

Sebenarnya materi ini lumayan sulit, tetapi karna saya serius ketika pak cepi mengajar di teori
saya bisa lebih mengerti terutama di bagian infix, prefix, dan postfix.
Saya juga bisa mengerti di bagian stack (tumpukan). Dimana tumpukan itu memiliki konsep first
in last out.

DAFTAR PUSTAKA

https://medium.com/easyread/memahami-konsep-stack-secara-sederhana-
bd4409ec560c
https://glints.com/id/lowongan/stack-adalah/#.Ymu8Tu1BzIU

Anda mungkin juga menyukai