LAPORAN PRAKTIKUM IV
STACK
Disusun untuk Memenuhi Matakuliah Praktikum Algoritma dan Struktur Data
Dibimbing oleh Bapak Utomo Pujianto
Oleh :
Anidia Wulan Sari
(150533601651)
Dimas Galih Ramadhan
(150533600571)
S1 PTI’15 OFF A
UNIVERSITAS NEGERI MALANG
FAKULTAS TEKNIK
JURUSAN TEKNIK ELEKTRO
PRODI S1 PENDIDIKAN TEKNIK INFORMATIKA
Maret 2016
MODUL IV
STACK
1.
TUJUAN
1. Memahami terminologi yang terkait dengan struktur data stack.
2. Memahami operasi-operasi yang ada dalam stack.
3. Dapat mengidentifikasi permasalahan-permasalahan pemrograman yang harus
diselesaikan dengan menggunakan stack, sekaligus menyelesaikannya.
2. DASAR TEORI
1. Pengertian Stack
Stack merupakan sebuah kumpulan data yang diletakkan di atas data lainya, seperti
sebuah tumpukan. Dengan demikian, stack merupakan salah satu struktur data yang
menerapkan prinsip LIFO (Last In First Out). Dimana elemen yang terakhir disimpan
dalam stack, menjadi elemen yang pertama diambil. Untuk meletakkan sebuah elemen
pada bagian atas dari stack, maka dilakukan operasi push. Sedangkan untuk
memindahkan sebuah elemen dari tempat atas tersebut dalam sebuah stack, maka
dilakukan operasi pop.
2. Operasi Dasar Pada Stack
Create
Merupakan operator yang berfungsi untuk membuat sebuah stack kosong.
Merupakan operator yang berfungsi untuk menentukan apakah suatu stack
merupakan stack kosong. Tanda bahwa sebuah stack kosong adalah Top bernilai
kurang dari nol (-1).
IsFull
Merupakan operator yang digunakan untuk memeriksa apakah stack yang
ada sudah penuh. Stack akan penuh jika puncak stack terletak tepat dibawah
jumlah maksimum yang dapat ditampung stack (Top = MAX_STACK-1).
Push
Merupakan operator yang berfungsi untuk menambahkan satu elemen ke
dalam stack dan tidak dapat dilakukan jika stack dalam keadaan penuh.
Pop
Merupakan operator yang berfungsi untuk mengeluarkan satu elemen
teratas dari dalam stack dengan syarat stack tidak dalam kondisi kosong.
Clear
Fungsi yang digunakan untuk mengosongkan stack dengan cara mengeset
Top dengan -1. Jika Top bernilai kurang dari nol maka stack dianggap kosong.
Retrieve
Fungsi yang digunakan untuk melihat nilai yang berada pada posisi
tumpukan teratas.
3. Pointer Sebagai Penunjuk Stack
Selain menggunakan indeks, untuk menunjuk sebuah Top atau posisi teratas dari
stack, dapat juga digunakan pointer sebagai berikut.
Membuat Stack Dengan Pointer
Proses Pop
4. Representasi Proses Stack
Stack adalah salah satu dari contoh struktur data yang terdiri dari satu collection,
yang juga menerapkan prinsip LIFO. Bila stack tersebut menggunakan array satu
dimensi, maka stack tersebut dapat diilustrasikan sebagai berikut :
Pada gambar 4.2 diatas diilustrasikan ada sebuah indeks array yang masih kosong
pada awal pembuatan stcak dimana n[10], variabel Top berada pada -1 yang
menunjukkan indeks masih dalam keadaan kosong.
Pada gambar 4.3 adalah keadaan ketika stack sudah diisi data. Pada kondisi ini data
pertama yang diinputkan adalah S[0]=11, data kedua S[1]=7, data ketiga S[2]=15, data
keempat S[23]=23. Kondisi Top sudah berubah menjadi data yang terakhir diinputkan
(data keempat) sehingga Top[3] X=23.
Variabel Top digunakan sebagai indeks untuk menunjuk nomor elemen array yang
berisi nilai stack yang berada paling kanan atau Top, yang ditunjukan dengan angka 3.
Variabel X bertipe integer digunakan sebagai perantara, dimana data yang akan
disimpan kedalam stack harus berasal dari X. Demikian juga data yang baru diambil
dari dalam stack harus diterima terlebih dahulu oleh variabel X, kemudian baru
diberikan ke variabel lain untuk diolah.
Oleh karena itu, jika ada instruksi PUSH, maka data baru (yang diambil dari isi
variabel X) akan disimpan dalam elemen S[4] sehingga indeks Top harus diarahkan ke
posisi no.4. Artinya, Top maju terlebih dahulu satu langkah ke S[4], kemudian baru
mengisi nilai pada S[4]. Sedangkan jika ada instruksi Pop, maka yang akan diambil
adalah isi dari S[3] dan datanya akan disimpan terlebih dahulu dalam variabel X,
kemudian indeks Top menjadi mundur satu langkah sehingga akan menunjuk S[2].
5. Double Stack
Double Stack atau Stack Ganda adalah dua stack yang berada dalam satu array.
Satu array digunakan untuk dua stack dimana dasar Stack1 berada pada sisi indeks
yang
terkecil dan dasar Stack2 berada pada sisi indeks yang terbesar. Sama halnya dengan
Single Stack, Double Stack juga menerapkan prinsip LIFO (Last in Firt Out).
Pada gambar 4.4 diatas adalah ilustrasi indeks array pada double stack. Padastack 1
kondisi data pertama yang diinputkan adalah S[0], data kedua S[1], data ketiga S[2]
dan Top=data input terakhir S[2]. Sedangkan pada stack 2 data pertama adalah S[9],
data kedua S[8], data ketiga S[7], data keempat S[6] dan Top=data input terakhir S[6].
6. Operasi Dasar Pada Double Stack
Inisialisasi
Proses awal adalah proses menyiapkan indeks petunjuk stack untuk pertama
kali. Pada tahap ini ditetapkan Top1=-1 (sama seperti single stack) dan
Top2=banyak jumlah data.
Is Empty
Sama dengan single stack, yaitu proses pengecekan stack dalam kondisi kosong
Is Full
Push (Stack1 dan Stack2)
Proses mengisi data pada stack1 maupun 2
Pop (Stack1 dan Stack2)
Proses mengambil data pada stack1 maupun 2
3. Latihan Praktikum
Latihan Praktikum 1
Pemrograman C++
Nama Program
: Single Stack
Bahasa Pemrogramam
: C++
Compiler
: MinGW Developer Studio
Script program
:
#include <iostream> #include <stdio.h> #include <conio.h> #include <windows.h> #define maxstack 4 using namespace std;struct STACK { //Membuat jenis data abstrak 'STACK' int top;
float data[4]; };
float dta;
struct STACK stackbaru; void inisialisasi() { stackbaru.top=-1; } bool isfull() { if(stackbaru.top==maxstack) return true; else return false; } bool isempty() { if(stackbaru.top==1) return true; else return false; }
void push(float dta) {
if(isfull()==true) {
puts("Maaf, stack penuh"); getch(); } else { stackbaru.top++; stackbaru.data[stackbaru.top]=dta; } }
void pop() {
if(isempty()==true) {
cout<<"Data telah kosong!"; getch();
} else {
cout<<"Data yang terambil adalah data ke: "<<stackbaru.data[stackbaru.top]<<endl; stackbaru.top--; getch(); } } void print() { for(int i=0;i<=stackbaru.top;i++) {cout<<stackbaru.data[i]<<" ";} } void clear() { stackbaru.top=-1; } int main() { inisialisasi(); char menu; char uulang; do{ system("cls"); printf("\t ---\n"); printf("\t | STACK |\n"); printf("\t ---\n"); printf("\n\ --> Menu STACK :\n\n"); puts("1. push stack");
puts("2. pop stack"); puts("3. cetak");
puts("4. bersihkan stack"); puts("5. exit");
cout<<"Menu pilihan anda: "; cin>>menu; if(menu=='2') { pop(); uulang='y'; } else if(menu=='1') {
cout<<"data yang akan disimpan di stack: "; cin>>dta; push(dta); uulang='y'; } else if(menu=='3') { print(); cout<<"\nUlang?(y/t) "; cin>>uulang; } else if(menu=='4') { clear(); cout<<"\nUlang?(y/t) "; cin>>uulang; } else if(menu=='5') { exit(0); } } while(uulang=='Y' || uulang=='y'); }
Output Program
:
Algoritma
:
1. Mulai.
2. Membaca file header.
3. Membaca fungsi struct STACK.
4. Membaca tipe data integer top, float data yang berisikan array dengan
elemen berjumlah 4 (float data [4]).
5. Membaca tipe data float dta.
6. Membaca fungsi struct STACK stackbaru.
7. Membaca fungsi inisialisasi.
8. Membaca fungsi bool isfull.
9. Membaca fungsi bool isempty.
10. Membaca fungsi push(float dta)
11. Membaca fungsi pop.
12. Membaca fungsi print ( untuk mencetak data ).
13. Membaca fungsi clear (untuk menghapus/ mengosongkan data).
14. Membaca fungsi utama.
15. Pemanggilan fungsi inisialisasi.
16. Membaca tipe data charr menu dan uulang.
17. Membaca pemanggilan percabangan do-while, yand didalamnya terdapat
pilihan menu dengan menggunakan perulangan if else.
18. Jika 1 maka pemanggilan fungsi pop dan uulang berfungsi.
19. Jika 2 maka fungsi push dan uulang, serta inputan data yang akan disimpan.
20. Jika 3 maka fungsi print dan uulang.
21. Jika 4 maka fungsi clear dan uulang.
22. Jika 5 maka fungsi exit (keluar).
23. Cetak hasil.
24. Selesai.
Diskripsi
:
Pada program ini menggunakan 4 file header. Penggunaan logika Boolean
pada fungsi pop dan push harus benar , jika tidak maka program saat dijalankan
akan error(outputnya tidak akan keluar dengan benar/ sesuai dengan yang
ditargetkan). Penulisan fungsi pop dan push perlu diperhatikan. Untuk menjalankan
setiap menu yang disediakan menggunakan percabangan do- while dengan
perulangan if else. Menu 1 apabila memilih pop maka fungsi pop akan berfungsi
mulai menjalankan logika Boolean yang ada pada deklarasi fungsi pop. Jika benar
maka data telah kosong jika salah maka data yang terambil diambl dengan
pembacaan fungsi stackbaru.data[stackbaru.top]. Menu 2 apabila memilih menu
push, maka fungsi push akan berfungsi, jika logika Boolean benar maka stack,
penuh
jika tidak maka akan berfungsi
“stackbaru.top++;
stackbaru.data[stackbaru.top]=dta;”.
Latihan Praktikum 2
Pemrograman C++
Nama Program
: Double Stack
Bahasa Pemrogramam
: C++
Compiler
: MinGW Developer Studio
Script program
:
#include <stdio.h> #include <conio.h> #include <stdlib.h> #define MAX 10 #define true 1 #define false 0 char stack[MAX]; int top1, top2; void init(void);void push(char data, int nomorstack); char pop(int nomorstack);
void clear(int nomorstack); int full(void);
int empty(int nomorstack); void baca();
int main() {
char data;
int pilih, nomorstack; init();
do{
system("cls");
printf("Contoh program double stack"); printf("\n1. Push");
printf("\n2. Pop"); printf("\n3. Clear"); printf("\n4. Cetak Data"); printf("\n5. Selesai"); printf("\nPilihan anda: "); scanf("%i", &pilih); switch(pilih){ case 1: printf("Push\n"); printf("Masukkan datanya:\n");
scanf("%s", &data);
printf("Mau dimasukkan ke stack berapa? 1 atau 2? \n"); scanf("%i", &nomorstack); push(data, nomorstack); break; case 2: printf("Pop\n");
printf("Masukkan nomor stack\n"); scanf("%i", &nomorstack);
printf("\nData yang akan dikeluarkan adalah %s", &data); pop(nomorstack); getch(); break; case 3: printf("Clear\n");
printf("Nomor stack yang akan dikosongkan\n"); scanf("%s", &nomorstack); clear(nomorstack); break; case 4: printf("Cetak Data:\n\n"); baca(); break; case 5: printf("Exit"); break; default:
printf("Pilihan yang anda masukkan tidak ada"); break; } } while(pilih!=5); getch(); } void init() { top1=-1; top2=MAX+1; }
{ if(full()!=true) { switch(nomorstack) { case 1: top1++; stack[top1]=data; break; case 2: top2--; stack[top2]=data; break; default:
printf("\nNomor stack salah"); break; } } else printf("\nStack penuh"); getch(); }
char pop(int nomorstack) { char data; if(empty(nomorstack)!=true) { switch(nomorstack) { case 1: data=stack[top1]; top1--; return data; break; case 2: data=stack[top2]; top2++; return data; break; default:
printf("\nNomor stack salah"); break;
} }
else
printf("\nStack masih kosong"); getch();
} int full(void) { if(top2-top1==1){ return true; } else return false; }
int empty(int nomorstack) { switch(nomorstack) { case 1: if(top1==0) return true; else return false; break; case 2: if(top2==MAX+1) return true; else return false; break; } }
void clear(int nomorstack) { switch(nomorstack) { case 1: top1=1; break; case 2: top2=MAX; break; default:
printf("Nomor stack salah"); break; } } void baca() { int i;
for(i=0;i<=top1;i++) {
printf("%c", stack[i]); printf("\n");
}
printf("Cetak isi stack kedua:\n"); for(i=MAX; i>=top2; i--)
{ printf("%c",stack[i]); printf("\n"); } getch(); }
Output Program
:
Algoritma
:
1. Mulai.
2. Membaca file header.
3. Membaca fungsi utama.
4. Membaca fungsi push
5. Membaca fungsi pop.
6. Membaca fungsi clear
7. Membaca fungsi print ( untuk mencetak data ).
8. Menampilkan Menu program double stack
9. Membaca tipe data charr menu dan uulang.
10. Membaca pemanggilan percabangan do-while, yand didalamnya terdapat
pilihan menu dengan menggunakan perulangan if else.
11. Jika 1 maka fungsi push dan uulang, serta inputan data yang akan disimpan.
12. Jika 2 maka pemanggilan fungsi pop dan uulang berfungsi.
13. Jika 3 maka fungsi clear dan uulang.
14. Jika 4 maka fungsi print dan uulang.
15. Jika 5 maka fungsi exit (keluar).
16. Cetak hasil.
17. Selesai.
Diskripsi
:
Pada program ini menggunakan 3 file header. Penggunaan logika pada
fungsi pop dan push harus benar , jika tidak maka program saat dijalankan akan
error(outputnya tidak akan keluar dengan benar/ sesuai dengan yang ditargetkan).
Penulisan fungsi pop dan push perlu diperhatikan. Untuk menjalankan setiap menu
yang disediakan menggunakan percabangan Menu 2 apabila memilih pop maka
fungsi pop akan berfungsi mulai menjalankan logika yang ada pada deklarasi
fungsi pop. Menu 1 apabila memilih menu push, maka fungsi push akan berfungsi,
jika logika benar .
Latihan Praktikum 3
Pemrograman C++
Nama Program
: Program pembalik kata dengan stack
Bahasa Pemrogramam
: C++
Compiler
: MinGW Developer Studio
Script program
:
#include <stdio.h> #include <conio.h> #include <iostream>
#include <string.h> #include <stdlib.h> #define MAX 75 #define true 1 #define false 0 char stack[MAX]; int top; void init(void); int full(void); int empty(void); char pop(void); void clear(void); void push(char info); main()
{
char pilih; char kal[75]; int k,p;
printf("-*- PROGRAM MEMBALIK KATA DENGAN STACK -*-\n\n");
init(); do {
printf(" ======================\n"); printf(" || MENU PILIHAN ||\n"); printf(" ======================\n"); printf(" ||[1] Masukan Kata ||\n"); printf(" ||[2] Balik Kata ||\n"); printf(" ||[3] Selesai ||\n"); printf(" ======================\n"); printf(" Pilihan: "); scanf("%s",&pilih); system("cls"); switch(pilih) { case '1': printf("\nMasukkan data: "); scanf("%s",&kal); p=strlen(kal); for(k=0;k<=p;k++) push(kal[k]);
printf("\nKata yang masuk: "); for(k=0;k<=p;k++) printf("%c", stack[k]); printf("\n"); break; case '2': if(empty()!=true) {
for(k=top;k>=0;k--)
printf("%c", pop()); printf("\n");
}
else printf("\nStack kosong!!\n"); break;
case '3': break; default:
printf("\nPilihan anda salah!!\n"); } printf("\n"); } while(pilih!='3'); } void init(void) { top=0; }
void push(char info) { if(full()!=true) { top++; stack[top]=info; } else printf("\nStack overlow...\n"); } char pop(void) { char info; if(empty()!=true) { info=stack[top]; top--; return(info); } else printf("\nStack underflow...\n"); } int full(void) { if(top==MAX) return(true); else return(false);
} int empty(void) { if(top==0) return(true); else return(false); }
Output Program
:
Algoritma
:
1. Mulai.
2. Membaca file header.
3. Membaca tipe data char stack[max] .
4. Membaca fungsi utama
5. Mencetak Menu dari program membalik kata denagn stack
6. Membaca pemanggilan percabangan
7. Jika 1 maka masuk pada case 1 masukkan kata
8. Jika 2 maka masuk pada case 2 balik kata
9. Jika 3 maka exit (keluar).
10. Cetak hasil.
11. Selesai.
Diskripsi
:
Program diatas merupaka program yang berfungsi membalikkan kalimat
dengan memanfaatkan fungsi- fungsi dalam stack. Penggunaan fungsi
operasi-operasi dasar dari stack , kemudia penggunaan tipe data char stack[MAX] yang
berfungsi menampung kalimat yang akan dibalik sebanyak 75 elemen yang
tersedia. Kemudian Penggunaan fungsi perulangan for yang digunakan untuk
membalikkan kata , yaitu :
for(k=0;k<=p;k++)
printf("%c", stack[k]);
4. Tugas Rumah
Tugas Rumah
Pemrograman C++
Nama Program
: Program Penyimpanan Data Mahasiswa
Bahasa Pemrogramam
: C++
Compiler
: MinGW Developer Studio
Script program
:
#include <iostream> #include <windows.h> #include <conio.h> using namespace std;
struct mahasiswa{char nim[50]; char nama[50];int data_nilai;}; void tmbh_mhs(); void push(mahasiswa); void init(); bool isFull(); bool isEmpty(); void sorting(int); void baca_mhs(); mahasiswa pop(); void baca_sorting();
int flag = -1; const int MAX = 10; mahasiswa db_mhs[MAX]; int main()
{
system("cls"); char inputan;
cout << "\t+++++++++++++ Program stack mahasiswa ++++++++ +++++\n";
cout << endl << endl;
cout << "\tJumlah stack : " << flag+1 << " Batas Maksimum : " << MAX;
cout << endl << endl;
cout << "\t+--- MENU UTAMA ---+\n";
cout << "\t| NO | PILIHAN |\n";
cout << "\t+----+---+\n";
cout << "\t| 1 | Tambahkan data mahasiswa (Push Stack) |\n";
cout << "\t| 2 | Tampilkan data mahasiswa (Pop stack) |\n";
cout << "\t| 3 | Tampilkan data dan sorting (Pop sorting) |\n";
cout << "\t+----+---+\n";
cout << "\tPilih menu : ";cin >> inputan; switch(inputan) { case '1' : tmbh_mhs(); break; case '2' : baca_mhs(); break; case '3' : baca_sorting(); break; }
} void push(mahasiswa mhs) { flag++; db_mhs[flag] = mhs; cout << db_mhs[flag].nim; } void tmbh_mhs() { int ipt; mahasiswa mhs; system("cls");
cout << "\t+++++++++++++Tambah Mahasiswa Menu (Push Menu) +++++++++++++\n";
cout << endl << endl;
cout << "\tMasukkan jumlah data : ";cin >> ipt;cout<<endl;
for(int i = 0;i < ipt;i++) { if(!isFull()) {
cout << "\tMahasiswa ke : " << i+1 << endl; cout << "\tMasukkan NIM : ";cin >> mhs.nim; cout << "\tMasukkan Nama : ";cin >> mhs.nama; cout << "\tMasukkan Nilai : ";cin >> mhs.data_nilai;
push(mhs);
cout << "\tData telah di push " << endl << endl; }
else {
cout << "\tData penuh."<<endl; break; } } system("pause"); system("cls"); main(); } bool isEmpty() {
if(flag == -1) return true; else return false;
}
bool isFull() {
if(flag == MAX-1) return true; else return false;
} mahasiswa pop() { return db_mhs[flag--]; } void baca_mhs() { int ipt; mahasiswa mhs; system("cls");
cout << "\t+++++++++++++Baca Mahasiswa Menu (Pop menu)+++ ++++++++++\n";
cout << endl << endl; if(isEmpty()) {
cout << "Data kosong\n"; system("pause");
main(); }
cout << "\tMasukkan jumlah data yang dikeluarkan : ";cin >> ipt;cout<<endl;
if(ipt <= flag+1) {
cout << "\t+---+---+---+\n";
cout << "\t| Nim Mahasiswa | Nama Mahasiswa | Nilai Mahasiswa |\n";
cout << "\t+---+---+---+\n";
for(int i = 0;i < ipt;i++) { if(!isEmpty()) {
mhs = pop();
cout << "\t " << mhs.nim << " \t\t " << mhs.nama << " \t\t " << mhs.data_nilai << endl << endl;
cout << "\t Data telah di pop " << endl << endl;
cout << "\t---\n";
} else {
cout << "\tData kosong."<<endl; break;
} } else {
cout << "Data tidak sebanyak itu\n"; } system("pause"); main(); } void sorting(int jml) { int j; int temp; char temp_i[2][50];
for(int i=0; i<jml; i++) {
temp = db_mhs[i].data_nilai; strcpy(temp_i[0],db_mhs[i].nim); strcpy(temp_i[1],db_mhs[i].nama); j = i-1;
while (db_mhs[j].data_nilai>temp && j>=0) {
db_mhs[j+1].data_nilai = db_mhs[j].data_nilai; strcpy(db_mhs[j+1].nama,db_mhs[j].nama); strcpy(db_mhs[j+1].nim,db_mhs[j].nim); j--; } db_mhs[j+1].data_nilai = temp; strcpy(db_mhs[j+1].nim,temp_i[0]); strcpy(db_mhs[j+1].nama,temp_i[1]); } } void baca_sorting() { int ipt; mahasiswa mhs; system("cls");
cout << "\t+++++++++++++Baca Mahasiswa Sorting Menu (Pop menu)+++++++++++++\n";
cout << endl << endl; if(isEmpty()) {
cout << "Data kosong\n"; system("pause");
main(); }
cout << "\tMasukkan jumlah data yang dikeluarkan : ";cin >> ipt;cout<<endl;
if(ipt <= flag+1) {
cout << "Sebelum sorting : \n\n";
cout << "\t+---+---+---+\n";
cout << "\t| Nim Mahasiswa | Nama Mahasiswa | Nilai Mahasiswa |\n";
cout << "\t+---+---+---+\n";
for(int i = ipt;i >= 0;i--) { if(!isEmpty()) {
mhs = db_mhs[i];
cout << "\t " << mhs.nim << " \t\t " << mhs.nama << " \t\t " << mhs.data_nilai << endl << endl;
cout << "\t Data tidak di pop " << endl << endl;
cout << "\t---\n";
} else {
cout << "\tData kosong."<<endl; break;
} }
sorting(ipt);
cout << "Sesudah Sorting : \n\n";
cout << "\t+---+---+---+\n";
cout << "\t| Nim Mahasiswa | Nama Mahasiswa | Nilai Mahasiswa |\n";
cout << "\t+---+---+---+\n";
for(int i = 0;i < ipt;i++) { if(!isEmpty()) {
mhs = pop();
cout << "\t " << mhs.nim << " \t\t " << mhs.nama << " \t\t " << mhs.data_nilai << endl << endl;
cout << "\t Data telah di pop " << endl << endl; cout << "\t---\n"; } else {
cout << "\tData kosong."<<endl; break;
} } } else {
cout << "Data tidak sebanyak itu\n"; }
system("pause"); main();
}