STACK
Tujuan Umum
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
DASAR TEORI
STACK
Stack adalah sebuah kumpulan data dimana data yang diletakkan di atas data yang
lain. Dengan demikian stack adalah struktur data yang menggunakan konsep LIFO. Dengan
demikian, elemen terakhir yang disimpan dalam stack menjadi elemen pertama yang diambil.
Dalam proses komputasi, untuk meletakkan sebuah elemen pada bagian atas dari stack, maka
kita melakukan push. Dan untuk memindahkan dari tempat yang atas tersebut, kita melakukan
pop.
Ada beberapa cara untuk menyajikan sebuah stack tergantung pada permasalahan
yang akan kita selesaikan. Dalam bab ini kita akan menggunakan cara yang paling sederhana,
tipe data yang sudah kita kenal, yaitu array. Kita dapat menggunakan array untuk menyajikan
sebuah stack, dengan anggapan bahwa banyaknya elemen maksimum dari stack tersebut tidak
akan melebihi batas maksimum banyaknya elemen dalam array.
Pada saat ukuran stack, kalau kita teruskan menambah data lagi, akan terjadi overflow.
Dengan demikian perlu data tambahan untuk mencatat posisi ujung stack. Dengan kebutuhan
seperti ini, kita dapat menyajikan stack dengan menggunakan tipe data struktur (struct) yang
terdiri dari dua field. Field pertama bertipe array untuk menyimpan elemen stack, medan
kedua bertipe integer untuk mencatat posisi ujung stack.
Ada 2 operasi paling dasar yang penting dari stack yang dapat dilakukan, yaitu :
a.
Operasi push yaitu operasi menambahkan elemen data pada urutan terakhir (paling
atas).
b.
Operasi pop yaitu operasi mengambil sebuah elemen data pada urutan terakhir dari
stack.
maksimumnya tidak dibatasi, maka linked list lebih tepat digunakan. Salah satu konsep yang
efektif untuk menyimpan dan mengambil data adalah “terakhir masuk sebagai yang pertama
keluar”
(Last
in
First
Out/LIFO). Dengan konsep ini, pengambilan data akan berkebalikan urutannya dengan
penyimpanan data.
Operasi Pada Stack
Operasi-operasi Dasar pada stack adalah sebagai berikut:
1.
Operasi data abstrak STACK
2.
Fungsi yang melakukan pengecekan apakah stack dalam kondisi kosong
3.
Fungsi yang melakukan pengecekan apakah stack dalam kondisi penuh
4.
Fungsi untuk menghapus seluruh stack
5.
Fungsi untuk mencetak isi stack
Percobaan 1
Algoritma dan Struktur Data
Nama Program
: Program STACK
Compiler
: Code Blocks
Script program
:
-
Script salah
#include <iostream> #define maxstack 5 using namespace std;
struct STACK //membuat jenis data abstrak 'STRACK' {
int top;
float data [4]; };
float dta;
struct STACK stackbaru;
bool isfull() //menanyakan : penuhkah? {
if(stackbaru.top == maxstack) return true;
else
return false; }
bool isempty() //menanyakan : kosongkah? {
if(stackbaru.top == -1) return true; else
return false; }
void push(float dta) //mengisi stack (menyimpan data di stack) {
if(isfull() == false) //jika stack belum penuh {
stackbaru.top++;
stackbaru.data[stackbaru.top] = dta; }
else {
puts("Maaf, stack penuh"); getch();
} }
void pop() //mengambil isi stack {
if(isempty() == false) {
cout<<"Data yang terambil : "<<stackbaru.data[stackbaru.top]<<endl;
stackbaru.top--; }
else {
cout<<"Data telah kosong!"; }
}
void print() //mencetak stack {
for(int i=0; i<= top; i++) {
cout<<stackbaru.data[i]<<" "; }
}
void clear() //menghapus semua stack {
top = -1; }
{
inisialisasi(); //pemanggilan fungsi inisialisasi char menu; char uulang; do { system("cls"); printf("Menu:\n"); puts("1. Pop stack"); puts("2. Push stack"); puts("3. Cetak");
puts("4. Bersihkan stack"); puts("5. Exit");
cout<<"Menu pilihan Anda: "; cin>>menu; if(menu == '1')
{
pop(); getch(); uulang = 'y'; }
else if(menu == '2') {
cout<<"Data yang akan disimpan di stack : "; cin>>dta; push(dta);
uulang = 'y'; }
else if(menu == '3') {
print();
cout<<"Ulang? (y/t) "; cin>>uulang; }
else if(menu == '4') {
clear();
cout<<"Ulang? (y/t) "; cin>>uulang; }
else if(menu == '5') {
exit(0); }
}
while(uulang == 'Y' || uulang == 'y'); }
-
Script Benar
#include <conio.h> #include <iostream> #include <stdio.h> #include <windows.h>#define maxstack 5 //maxstack terdefinisi 5
using namespace std; //untuk pembacaan karakter spasi
struct STACK //membuat jenis data abstrak 'STRACK' {
int top;
float data [4]; };
float dta;
struct STACK stackbaru;
void inisialisasi() //menginisialisasi top = -1 {
stackbaru.top = -1; }
bool isfull() //menanyakan : penuhkah? {
return true; else
return false; }
bool isempty() //menanyakan : kosongkah? {
if(stackbaru.top == -1) return true; else
return false; }
void push(float dta) //mengisi stack (menyimpan data di stack) {
if(isfull() == false) //jika stack belum penuh {
stackbaru.top++;
stackbaru.data[stackbaru.top] = dta; }
else {
puts("Maaf, stack penuh"); getch();
} }
void pop() //mengambil isi stack {
if(isempty() == false) {
cout<<"Data yang terambil : "<<stackbaru.data[stackbaru.top]<<endl; stackbaru.top--;
} else {
cout<<"Data telah kosong!"; }
}
void print() //mencetak stack {
cout<<"Data pada stack : ";
for(int i=0; i<=stackbaru.top; i++) {
cout<<stackbaru.data[i]<<" "; }
}
void clear() //menghapus semua stack {
stackbaru.top = -1; }
int main() {
inisialisasi(); //pemanggilan fungsi inisialisasi
char menu; char uulang;
do {
system("cls");
printf("Menu:\n"); puts("1. Pop stack"); puts("2. Push stack"); puts("3. Cetak");
cout<<"Menu pilihan Anda: "; cin>>menu;
if(menu == '1') {
pop(); getch(); uulang = 'y'; }
else if(menu == '2') {
cout<<"Data yang akan disimpan di stack : "; cin>>dta; push(dta);
uulang = 'y'; }
else if(menu == '3') {
print();
cout<<"Ulang? (y/t) "; cin>>uulang; }
else if(menu == '4') {
clear();
cout<<"Ulang? (y/t) "; cin>>uulang; }
else if(menu == '5') {
exit(0); }
}
while(uulang == 'Y' || uulang == 'y'); }
Algoritma :
1. Mulai.
2. Membaca header file
3. Mendeklarasikan fungsi stack
a. Struct Stack (membuat jenis data abstrak 'STRACK')
b. Void inisialisasi (menginisialisasi top = -1)
c. Bool isfuul (menanyakan : penuhkah?)
d. Bool isempety (menanyakan : kosongkah?)
e. Void push (mengisi stack, menyiman data di stack)
f. Void pop (mengambil isi stack)
g. Void print (mencetak stack)
h. Void clear (menghapus semua stack)
4. Pilihan Menu Stack
a). Menu 1 adalah Pop stack, jika pilih satu maka akan memanggil fungsi pop :
void pop() //mengambil isi stack{
if(isempty() == false) {
cout<<"Data yang terambil : "<<stackbaru.data[stackbaru.top]<<endl;
stackbaru.top--; }
else {
cout<<"Data telah kosong!"; }
}
b). Menu 2 adalah Push stack, jika pilih 2 maka akan memanggil fungsi push :
void push(float dta) //mengisi stack (menyimpan data di stack) {if(isfull() == false) //jika stack belum penuh {
stackbaru.top++;
stackbaru.data[stackbaru.top] = dta; }
else {
puts("Maaf, stack penuh"); getch();
} }
c). Menu 3 adalah Cetak, jika pilih 3 maka akan memanggil fungsi print :
void print() //mencetak stack{
cout<<"Data pada stack : ";
for(int i=0; i<=stackbaru.top; i++) {
}
d). Menu 4 adalah Bersihkan stack, jika pilih 4 maka akan memanggil fungsi
clear :
void clear() //menghapus semua stack {
stackbaru.top = -1; }
e). Menu 5 adalah exit, jika pilih 5 maka program akan diakhiri
5. Selesai
Deskripsi:
Pada script awal program ini header file pada program kurang, header file ditambah
dengan
#include <conio.h>#include <stdio.h> #include <windows.h>
Program diatas juga akan menghasilkan sebuah program yang menampilkan 5 pilihan menu
stack, diantara nya adalah pop stack yaitu untuk mengambil isi stack, push stack yaitu
mengisi dan menyimpan data di stack, selanjutnya ada, cetak yaitu akan menampilkan data
stack yang telah disimpan, menu selanjutnya bersihkan stack yaitu data stack akan
dibersihkan kembali, dan yang terakhir adalah exit.
Tugas Praktikum
Algoritma dan Struktur Data
Nama Program
: Program pembalikan kalimat dengan menggunakan
stack
Bahasa Pemrogramam
: C++
Compiler
: Code Blocks
Script program
:
//program yang dapat membalikkan kalimat dengan menggunakan stack #include <iostream>
#include <windows.h> #include <stdio.h> #include <conio.h> #define maxstack 200 using namespace std;
struct STACK //membuat jenis data abstrak stack {
int top;
char data[maxstack]; // pendeklarasian untuk menginputkan suatu kalimat dengan maks 200
};
char dta[maxstack]; struct STACK stackbaru;
bool isfull() // fungsi untuk mengetahui apakah stack dalam kondisi penuh (menggunakan boolean)
{
if (stackbaru.top == maxstack-1)
return true; // jika pengkondisian stack dalam keadaan penuh maka benar else
bool isempty() // fungsi untuk mengetahui apakah stack dalam kondisi kosong
{
if (stackbaru.top == -1) return true;
else return false; }
void push(char dta) // fungsi untuk proses push {
if (isfull() == false) // jika kondisi stack tidak penuh {
stackbaru.top++;// user menginputkan data dengan menggunakan variabel dta dimana dta tersebut akan disimpan di stackbaru yang paling atas
stackbaru.data[stackbaru.top]=dta; // increment, yang bermksud jika penginputan dta lagi maka akan tersimpan diatas dta sebelumnnya }
else // jika stack dalam kondisi penuh {
cout << "\nMaaf Stack penuh"; }
}
void pop() //mengambil isi stack {
while (isempty() == false) // jika kondisi stack tidak kosong {
cout<<stackbaru.data[stackbaru.top]; // akan menampilkan data di stack dimana data tersebut berada yang paling atas
stackbaru.top--; // decrement, maksudnya jika user memilih menu pop lagi maka rogam akan menampilkan data dibawah data yang telah terambiil sebelumnya
} }
void print() //mencetak stack {
system ("cls");
cout<<"\nKalimat awal : ";
for (int i=0; i<=stackbaru.top; i++) // diulang sebanyaknya data yang tersimpan didta
{
cout<<stackbaru.data[i]; }
}
void clear() {
stackbaru.top = -1; }
int main() {
char kata[200]; //menampung inputan
cout<< "Masukkan kalimat : "; gets(kata);
cout << endl;
for(int i=0; kata[i]; i++) {
push(kata[i]); }
print(); cout << endl;
pop(); cout<<"\n";
}
Output Program:
Algoritma :
1. Mulai.
2. Membaca header file
3. Deklarasi fungsi stack
a.
Struct Stack (membuat jenis data abstrak 'STRACK')
b.
Bool isfuul (fungsi untuk mengetahui apakah stack dalam kondisi penuh
(menggunakan boolean)
c.
Bool isempety (fungsi untuk mengetahui apakah stack dalam kondisi kosong)
d.
Void push (mengisi stack, menyiman data di stack)
e.
Void pop (mengambil isi stack)
f.
Void print (mencetak stack)
g.
Void clear (menghapus semua stack)
4. Masukkan sebuah kalimat. Pada proses ini akan menggunakan fungsi push
dan disimpan pada fungsi push :
void push(char dta) // fungsi untuk proses push {
if (isfull() == false) // jika kondisi stack tidak penuh {
stackbaru.top++;// user menginputkan data dengan menggunakan variabel dta dimana dta tersebut akan disimpan di stackbaru yang paling atas
stackbaru.data[stackbaru.top]=dta; // increment, yang bermksud jika penginputan dta lagi maka akan tersimpan diatas dta sebelumnnya
}
else // jika stack dalam kondisi penuh {
cout << "\nMaaf Stack penuh"; }
5. Hasil akan menampilkan kalimat awal dan setelah kalimat dibalik, untuk
membalik kalimat akan memanggil fungsi pop :
void pop() //mengambil isi stack {
while (isempty() == false) // jika kondisi stack tidak kosong {
cout<<stackbaru.data[stackbaru.top]; // akan menampilkan data di stack dimana data tersebut berada yang paling atas
stackbaru.top--; // decrement, maksudnya jika user memilih menu pop lagi maka rogam akan menampilkan data dibawah data yang telah terambiil sebelumnya
} }
6. Selesai
Deskripsi :
Program diatas adalah program untuk membalikan sebuah kalimat
menggunakan fungsi-fungsi stack. Fungsi-fungsi stack yang digunakan adalah
struct STACK yaitu untuk membuat jenis data abstrak stack, bool isfull() yaitu
fungsi untuk mengetahui apakah stack dalam kondisi penuh (menggunakan
boolean), bool isempty() yaitu fungsi untuk mengetahui apakah stack dalam
kondisi kosong, void push(char dta) yaitu fungsi untuk proses push atau mengisi
data, void pop() yaitu untuk mengambil isi stack, void print() yaitu untuk
mencetak stack, void clear() yaitu untuk membersihkan stack.
Tugas Rumah
Algoritma dan Struktur Data
Nama Program
: Program Kata
Bahasa Pemrogramam
: C++
Compiler
: Code Blocks.
Script program :
#include <iostream> #include <string.h> #include <stdlib.h> #define maxstack 10using namespace std;
char pilih,tampil,ulang; int data_sama;
struct STACK /* deklarasi struktur STACK */ {
int top;
string nama[maxstack]; }stack_var;
bool isfull() /* fungsi boolean untuk mengecek apakah dalam kondisi penuh ? */
{
if (stack_var.top == maxstack-1) return true; else return false;
}
bool isempty() /* fungsi boolean untuk mengecek apakah dalam kondisi kosong ? */
{
if (stack_var.top == -1) return true; else return false;
}
void push() /* mengisi stack */ {
if (isfull() == true) {
cout << "\nMaaf Stack Penuh"; }
else {
stack_var.top++; do
{
data_sama=0;
cout<<"\n ID : ";
cin>>stack_var.id[stack_var.top]; for (int i=0;i<stack_var.top;i++) {
if (stack_var.id[stack_var.top]==stack_var.id[i]) /* jika ID dalam kondisi sama maka menampilkan sebuah statement */
{
data_sama=1;
cout<<"\nID sudah di gunakan...!!\n\n"; cout<<"Tampilkan Data...?? (y/t)? "; cin>>tampil;
if (tampil=='y'||tampil=='Y') {
cout<<"ID : "<<stack_var.id[i]<<"\nNama : "<<stack_var.nama[i]<<endl; /* menampilan ID yang sama */
}break; }
}
} while (data_sama==1);
cout<<"\n Nama : ";
cin>>stack_var.nama[stack_var.top]; }
}
void pop () { /* mengambil isi stack */ if (isempty()==true) {
cout<<"Maaf, Stack Masih Kosong...!!\n"; } else {
cout<<"Data yang terambil : \nID : "<<stack_var.id[stack_var.top]<<"\nNama : "<<stack_var.nama[stack_var.top]<<endl; cout<<"Telah di Ambil...!!\n\n"; stack_var.top--;
} }
{
cout<<"\nData :";
cout<<"\n| ID | Nama |"; for (int i=stack_var.top; i>=0; i--) {
cout<<"\n| "<<stack_var.id[i]<<" | "<<stack_var.nama[i]<<" "<<"|"<<endl;
cout<<"+---+"; }
}
void clear (){ /* menghapus isi stack */ stack_var.top = -1;
cout<<"Data Telah Kosong...!!\n\n"; }
void inisialisasi() /* karena dalam array di mulai pada indeks ke 0 */ {
stack_var.top=-1; }
int main() {
inisialisasi(); do
{
system("cls"); cout<<"\n\n";
cout<<" | ^^ MENU STACK ^^ |\n"; cout<<" |==========================|\n"; cout<<" | 1. Masukkan Data |\n"; cout<<" | 2. Keluarkan Data |\n"; cout<<" | 3. Kosongkan Data |\n"; cout<<" | 4. Tampilkan Data |\n"; cout<<" | 5. Keluar |\n\n";
cout<<"Pilih : ";cin>>pilih; switch(pilih)
{
case '1': push();
cout<<"\n\nMenu Utama (y/t) ?"; cin>>ulang;
break;
case '2': pop();
cout<<"\n\nMenu Utama (y/t) ?"; cin>>ulang;
break;
case '3': clear();
cout<<"\n\nMenu Utama (y/t) ?"; cin>>ulang;
break;
case '4': print();
cout<<"\n\nMenu Utama (y/t) ?"; cin>>ulang;
break;
case '5':
cout<<"\t\t\tThanks You \n"; exit(0);
cout<<"\n\nMenu Utama (y/t) ?"; cin>>ulang;
default :
cout<<"Maaf yang Anda Input Salah...!!\n\n"; cout<<"Menu Utama (y/t) ?";
cin>>ulang; break; }
} while (ulang=='Y'||ulang=='y');
}
Algoritma :
1. Mulai
2. Membaca header file
3. Deklarasi Fungsi stack
a.
Struct Stack (membuat jenis data abstrak 'STRACK')
b.
Bool isfuul (fungsi untuk mengetahui apakah stack dalam kondisi penuh
(menggunakan boolean)
c.
Bool isempety (fungsi untuk mengetahui apakah stack dalam kondisi kosong)
d.
Void push (mengisi stack, menyiman data di stack)
e.
Void pop (mengambil isi stack)
f.
Void print (mencetak stack)
g.
Void clear (menghapus semua stack)
h.
Void inisialisasi() (karena dalam array di mulai pada indeks ke 0)
4. Masuk kepilihan menu Stack
1. Masukkan Data :
Jika pilih menu 1 maka akan memanggil fungsi push :
void push() /* mengisi stack */{
if (isfull() == true) {
cout << "\nMaaf Stack Penuh"; }
else {
stack_var.top++; do
{
data_sama=0;
cout<<"\n ID : ";
cin>>stack_var.id[stack_var.top];
for (int i=0;i<stack_var.top;i++) {
if (stack_var.id[stack_var.top]==stack_var.id[i]) /* jika ID dalam kondisi sama maka menampilkan sebuah statement */
{
data_sama=1;
cout<<"\nID sudah di gunakan...!!\n\n"; cout<<"Tampilkan Data...?? (y/t)? "; cin>>tampil;
if (tampil=='y'||tampil=='Y') {
cout<<"ID : "<<stack_var.id[i]<<"\nNama : "<<stack_var.nama[i]<<endl; /* menampilan ID yang sama */
}break; }
}
cout<<"\n Nama : ";
cin>>stack_var.nama[stack_var.top]; }
}
2. Keluarkan Data :
Jika pilih menu 2, maka akan memanggil fungsi pop :
void pop () { /* mengambil isi stack */if (isempty()==true) {
cout<<"Maaf, Stack Masih Kosong...!!\n"; } else {
cout<<"Data yang terambil : \nID : "<<stack_var.id[stack_var.top]<<"\nNama : "<<stack_var.nama[stack_var.top]<<endl; cout<<"Telah di Ambil...!!\n\n"; stack_var.top--;
} }
3. Kosongkan Data :
Jika pilih menu 3, maka akan memanggil fungsi clear :
void clear (){ /* menghapus isi stack */stack_var.top = -1;
cout<<"Data Telah Kosong...!!\n\n"; }
4. Tampilkan Data :
Jika pilih menu 4, maka akan memanggil fungsi print :
void print() /* mencetak stack */{
cout<<"\nData :";
cout<<"\n| ID | Nama |"; for (int i=stack_var.top; i>=0; i--) {
cout<<"\n| "<<stack_var.id[i]<<" | "<<stack_var.nama[i]<<" "<<"|"<<endl;
cout<<"+---+"; }
}
5. Keluar
5. Selesai
Deklarasi :
dimasukkan oleh user dengan terurut secara DESCENDING. Jika pilih menu 5 maka akan
keluar dari program.
KESIMPULAN
1.
Stack adalah sebuah kumpulan data dimana data yang diletakkan di atas data yang
lain.
2.
Ada 2 operasi paling dasar yang penting dari stack yang dapat dilakukan, yaitu :
a). Operasi push yaitu operasi menambahkan elemen data pada urutan terakhir (paling
atas).
b). Operasi pop yaitu operasi mengambil sebuah elemen data pada urutan terakhir dari
stack.
3. Operasi-operasi Dasar pada stack adalah sebagai berikut:
1.
Operasi data abstrak STACK
2.
Fungsi yang melakukan pengecekan apakah stack dalam kondisi kosong
4.
Fungsi untuk menghapus seluruh stack
5.
Fungsi untuk mencetak isi stack