STACK
Tujuan Umum
Memahami terminologi yang terkait dengan struktur data stack
Memahami operasi-operasi yang ada dalam stack
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 :
Operasi push yaitu operasi menambahkan elemen data pada urutan terakhir (paling atas).
Operasi pop yaitu operasi mengambil sebuah elemen data pada urutan terakhir dari stack.
Tumpukan disebut juga "Push Down Back" yaitu penambahan elemen baru (push) dan penghapusan elemen dari tumpukan (pop) Untuk mengimplementasikan stack, bisa menggunakan linked list atau juga array, tergantung pada permasalahan yang dihadapi. Apabila permasalahan yang dihadapi adalah permasalahan tumpukan (stack) dimana jumlah elemen maksimum dibatasi, maka bisa digunakan array. Apabila jumlah elemen 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:
Operasi data abstrak STACK
Fungsi yang melakukan pengecekan apakah stack dalam kondisi kosong
Fungsi yang melakukan pengecekan apakah stack dalam kondisi penuh
Fungsi untuk menghapus seluruh stack
Fungsi untuk mencetak isi stack
Percobaan 1
Algoritma dan Struktur Data
Nama Program : Program STACK
Bahasa Pemrogramam : C++
Compiler : Code Blocks
Script program :
Script salah
#include
#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.top--;
}
else
{
cout<<"Data telah kosong!";
}
}
void print() //mencetak stack
{
for(int i=0; i<= top; i++)
{
cout<
}
}
void clear() //menghapus semua stack
{
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");
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
#include
#include
#include
#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?
{
if(stackbaru.top == maxstack-1)
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.top--;
}
else
{
cout<<"Data telah kosong!";
}
}
void print() //mencetak stack
{
cout<<"Data pada stack : ";
for(int i=0; i<=stackbaru.top; i++)
{
cout<
}
}
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");
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');
}
Output Program :
Algoritma :
Mulai.
Membaca header file
Mendeklarasikan fungsi stack
Struct Stack (membuat jenis data abstrak 'STRACK')
Void inisialisasi (menginisialisasi top = -1)
Bool isfuul (menanyakan : penuhkah?)
Bool isempety (menanyakan : kosongkah?)
Void push (mengisi stack, menyiman data di stack)
Void pop (mengambil isi stack)
Void print (mencetak stack)
Void clear (menghapus semua stack)
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.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++)
{
cout<
}
}
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
#include
#include
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
#include
#include
#include
#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
return false;
}
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.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<
}
}
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;
cout<<"Dibalik jadi : ";
pop();
cout<<"\n";
}
Output Program:
Algoritma :
Mulai.
Membaca header file
Deklarasi fungsi stack
Struct Stack (membuat jenis data abstrak 'STRACK')
Bool isfuul (fungsi untuk mengetahui apakah stack dalam kondisi penuh (menggunakan boolean)
Bool isempety (fungsi untuk mengetahui apakah stack dalam kondisi kosong)
Void push (mengisi stack, menyiman data di stack)
Void pop (mengambil isi stack)
Void print (mencetak stack)
Void clear (menghapus semua stack)
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";
}
}
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.top--; // decrement, maksudnya jika user memilih menu pop lagi maka rogam akan menampilkan data dibawah data yang telah terambiil sebelumnya
}
}
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
#include
#include
#define maxstack 10
using namespace std;
char pilih,tampil,ulang;
int data_sama;
struct STACK /* deklarasi struktur STACK */
{
int top;
int id[maxstack];
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
{
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 : "<
}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 : "<
cout<<"Telah di Ambil...!!\n\n";
stack_var.top--;
}
}
void print() /* mencetak stack */
{
cout<<"\nData :";
cout<<"\n" ID " Nama "";
for (int i=stack_var.top; i>=0; i--)
{
cout<<"\n" "<
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;
break;
default :
cout<<"Maaf yang Anda Input Salah...!!\n\n";
cout<<"Menu Utama (y/t) ?";
cin>>ulang;
break;
}
} while (ulang=='Y'""ulang=='y');
}
OutProgram :
Algoritma :
Mulai
Membaca header file
Deklarasi Fungsi stack
Struct Stack (membuat jenis data abstrak 'STRACK')
Bool isfuul (fungsi untuk mengetahui apakah stack dalam kondisi penuh (menggunakan boolean)
Bool isempety (fungsi untuk mengetahui apakah stack dalam kondisi kosong)
Void push (mengisi stack, menyiman data di stack)
Void pop (mengambil isi stack)
Void print (mencetak stack)
Void clear (menghapus semua stack)
Void inisialisasi() (karena dalam array di mulai pada indeks ke 0)
Masuk kepilihan menu Stack
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
{
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 : "<
}break;
}
}
} while (data_sama==1);
cout<<"\n Nama : ";
cin>>stack_var.nama[stack_var.top];
}
}
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 : "<
cout<<"Telah di Ambil...!!\n\n";
stack_var.top--;
}
}
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";
}
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" "<
cout<<"+----------------------+";
}
}
Keluar
Selesai
Deklarasi :
Program ini akan menampilkan sebuah menu pilihan stack yang terdiri dari 5 menu, diantara nya adalah, masukkan data, keluarkan data, kosongkan data, tampilkan data, dan keluar. Pada menu pilihan pertama yaitu masukkan data, user akan diminta untuk memasukkan ID dan Nama, setelah itu ID dan Nama yang telah dimasukkan user akan disimpan, kemudian user akan diminta untuk memilih kembali kemenu utama atau tidak. Ketika user kembali kemenu utama, maka user akan memasukkan ID dan Nama kembali, jika user memasukkan ID yang sama maka user akan diminta untuk memasukkan ulang dengan ID yang berbeda. Setelah itu jika user memilih menu 2 maka akan ditampilkan data terakhir yang dimasukkan oleh user, jika menu 3 maka semua data yang telah disimpan pada stack akan dibersihkan, jika user memilih menu 4 maka akan ditampilkan semua data yang telah dimasukkan oleh user dengan terurut secara DESCENDING. Jika pilih menu 5 maka akan keluar dari program.
KESIMPULAN
Stack adalah sebuah kumpulan data dimana data yang diletakkan di atas data yang lain.
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:
Operasi data abstrak STACK
Fungsi yang melakukan pengecekan apakah stack dalam kondisi kosong
Fungsi yang melakukan pengecekan apakah stack dalam kondisi penuh
Fungsi untuk menghapus seluruh stack
Fungsi untuk mencetak isi stack
DAFTAR RUJUKAN
Tim Asisten Dosen. 2014. Modul 4 STACK. Malang: Unversitas Negeri Malang.
http://mahfuzm.blogspot.com/2011/04/program-stack-c.html