Site icon UNYDeveloperNetwork

Tutorial: (Struktur Data) Membuat Implementasi Stack Sederhana dengan Java

Reading Time: 7 minutes

Selamat datang di blogs UNYDeveloperNetwork. Pada artikel tutorial kali ini, Saya akan memberikan tutorial kepada Anda membuat implementasi stack sederhana dengan Java. Apakah itu Stack? Bagaimana cara mengimplementasikannya dengan Java? Mari kita simak artikel tutorial ini lebih dalam lagi.

Apakah Itu Stack?

Sebagai anak Informatika yang baru belajar struktur data, atau yang sudah melewati mata kuliah struktur data, pasti kenal dengan yang namanya Stack. Apakah itu stack? untuk lebih memudahkan pemahaman stack, mari kita ingat kembali memori masa lalu kita ketika sekolah di SD. Ketika kita selesai mengerjakan ulangan, pasti kita akan mengumpulkannya di meja guru. Selanjutnya guru akan mulai memeriksa hasil pekerjaan kita mulai dari lembar ulangan yang paling terakhir dikumpulkan (paling terakhir, paling atas). Itulah stack atau tumpukan. Jadi tumpukan adalah sebuah koleksi objek yang menerapkan konsep LIFO (Last In First Out). Jadi data terakhir yang masuk adalah yang diproses terlebih dahulu. Berkebalikan dengan Queue atau Antrian yang mana data yang masuk terlebih dahulu akan diproses terlebih dahulu.

Dari gambar di atas, kita dapat mengetahui terdapat dua operasi dasar dalam stack, yakni push dan pop. Operasi push digunakan untuk memasukkan data ke dalam stack sedangkan operasi pop digunakan untuk mengeluarkan data dari stack. Lalu, apakah kapasitas stack dapat penuh? Ini yang menarik. Stack dapat penuh apabila metode penyimpanan datanya menggunakan array klasik atau array yang didefinisikan panjangnya. Sedangkan, apabila menggunakan ArrayList, maka tumpukan bisa lebih besar kapasitas (maksimal hingga nilai terbesar integer). Untuk tutorial di artikel ini Saya menggunakan model array klasik sehingga akan memiliki limitasi di kapasitasnya.

Bagaimanakah Penerapan Stack Dalam Java?

Baik, sesuai dengan judulnya, kita akan menerapkan stack dengan menggunakan bahasa pemrograman Java.

Pertama, buatlah class dengan nama JavaStack lengkap dengan main methodnya.

public class JavaStack {
     public static void main(String[] args){
     }
}

Kedua, import java.util.Scanner dan java.util.InputMismatchException. Letakkan di atas nama class.

import java.util.InputMismatchException;
import java.util.Scanner;

Mengapa Saya menggunakan java.util.InputMismatchException? Anda dapat membacanya di sini.

Ketiga, buatlah dua variabel. Variabel pertama adalah Integer Array dengan panjang 5 dengan nama stack, dan yang kedua adalah variabel Integer dengan nama variabel counters dan dengan nilai awal = 0. Variabel Integer Array inilah storage yang Saya gunakan untuk stack Saya dan sebagai pointer dan counternya, Saya menggunakan variabel counters. Letakkan kedua variabel setelah nama class.

private static int[] stack = new int[5];
private static int counters = 0;

Keempat, buat sebuah return value method untuk memeriksa apakah kapasitas stack penuh atau tidak. Method akan mengembalikan nilai TRUE jika masih terdapat tempat untuk menempatkan value dalam stack. Namun, apabila kapasitas stack sudah penuh, maka method akan mengembalikan nilai FALSE.

private static boolean stackStorage() {
    if(counters < stack.length) {
        return true;
    }
    else {
        return false;
    }
}

Kelima, buatlah sebuah method void untuk menghandle aksi push.

private static void createStack() {
    int loopX = 0;
    int alpha = 0;
    while(loopX == 0) {
        System.out.print("Masukkan Data (angka): ");
        Scanner alphaX = new Scanner(System.in);
        try {
            alpha = alphaX.nextInt();
            loopX = 1;
        }
        catch(InputMismatchException e) {
            System.out.println("Masukan harus berupa Angka!");
            loopX = 0;
        }
    }
    stack[counters] = alpha;
    counters++;
}

Mari kita lihat sejenak method di atas. Karena saya ingin menghandle inputan agar benar – benar terbebas dari error, maka terlebih dahulu Saya pastikan bahwa proses pemasukan (input) value adalah benar. Jika tidak, maka proses pemasukan (input) value akan terus diulang hingga memperoleh masukan yang benar; yakni berupa angka. Oleh karena itu, Saya buat variabel integer loopX dengan nilai awal 0; Apabila variabel loopX ini masih terus menerus bernilai 0, maka proses pemasukan (input) akan terus diulang.

Kemudian, Saya buat variabel lokal integer dengan nama alpha dan dengan nilai awal 0 sebagai variabel untuk menampung masukan.

Masuk ke dalam looping while, sudah Saya jelaskan tadi, bahwa selama nilai loopX adalah 0, maka looping akan terus dilakukan: hingga mendapatkan input yang benar. Oleh karena itu, untuk memastikan bahwa inputannya benar, Saya handle inputan Scanner dengan menggunakan try catch. Ketika try, dan memperoleh inputan yang benar, maka loopX akan bernilai 1, dan looping selesai. Namun ketika try, ternyata memperoleh inputan yang salah (inputan selain angka), maka selain menampilkan pesan error, looping juga akan terus dilakukan, hingga memperoleh inputan yang benar.

Setelah keluar dari looping, inputan dimasukkan ke dalam array stack sebagai stack dan value counters bertambah 1. Yang artinya, sudah ada 1 value di dalam stack. Counters akan terus bertambah hingga batas titik maksimal array stack dapat menampung (5 value).

Keenam, buatlah sebuah method void untuk menghandle aksi pop.

private static void removeStack() {
    counters--; 
    System.out.println("Data terakhir dalam stack sudah dikeluarkan");
}

Dalam method tersebut, dapat kita lihat bahwa Saya hanya mengurangi counters nya saja. Karena secara default, apabila nilai counters dikurangi, maka akan menunjuk ke elemen array sesuai dengan value counters-nya. Apabila ditambahkan value baru, maka elemen array terakhir yang tidak ditunjuk oleh counters akan diisi dengan value baru tersebut.

Ketujuh, Saya ingin menampilkan data yang tersimpan di dalam stack. Maka saya membuat satu method void seperti di bawah ini.

private static void displayDataStack() {
    System.out.print("Data dalam Stack: ");
    for(int i = 0; i < counters; i++) {
        System.out.print(" ["+i+" => "+stack[i]+"]" );
    }
    System.out.println("");
}

Kedelapan, Saya juga ingin membuat sebuah aksi yang dapat membersihkan stack. Oleh karena itu, Saya membuat method void yang men-set counters ke = 0; Sehingga dapat menunjuk langsung ke element array ke 0.

private static void cleanStack() {
    counters = 0;
}

Kesembilan, saya membuat method untuk menghandle fungsi exit

private static void quitApp() {
    String quitss = "y";
    System.out.print("Keluar dari Program? (Y/T): ");
    quitss = new Scanner(System.in).nextLine();
    if(quitss.equalsIgnoreCase("y")) {
        System.exit(0);
    }
    else {
        menuProgram();
    }
}

Kesepuluh, Saya membuat menu untuk menambahkan interaksi antara user dan program.

private static void menuProgram() {
    int loopX = 0;
    int choosenMenu = 0;
    while(loopX == 0) {
        System.out.println("\nContoh Program Stack dengan Java");
        System.out.println("Menu: ");
        System.out.println("1. Tambah Stack");
        System.out.println("2. Keluarkan 1 data dari Stack");
        System.out.println("3. Status Stack");
        System.out.println("4. Tampilkan data dalam Stack");
        System.out.println("5. Bersihkan Stack");
        System.out.println("6. Keluar dari Program");
        System.out.print("Pilihan Menu (1 - 6) >>> ");
        Scanner menuOption = new Scanner(System.in);
        try {
            choosenMenu = menuOption.nextInt();
            loopX = 1;
        }catch(InputMismatchException e) {
            System.out.println("Masukan harus Angka!");
        }
    }
    System.out.println("");
    menuChooser(choosenMenu);
}

Kesebelas, untuk dapat menghandle pemilihan menu, Saya membuat method dengan fungsi switch di dalamnya.

private static void menuChooser(int choosenMenu) {
    switch(choosenMenu) {
        case 1:
            boolean check = stackStorage();
            if(check) {
                createStack();
            }
            else {
                System.out.println("Stack Penuh!, kosongkan satu data terlebih dahulu!");
            }
            break;
        case 2:
            removeStack();
            break;
        case 3:
            System.out.println("Status Storage: ");
            System.out.println("Kapasitas: " + stack.length);
            System.out.println("Terisi   : " + counters);
            break;
        case 4:
            displayDataStack();
            break;
        case 5:
            cleanStack();
            break;
        case 6:
            quitApp();
            break;
    }
    menuProgram();
}

Terakhir, kita panggil method menuProgram(); di Main method.

public static void main(String[] args) {
    menuProgram();
}

Selanjutnya, mari kita Run.

Pertama kali program kita run, program akan menampilkan menu. Selanjutnya kita akan memeriksa storage dari stack kita. Oleh karenanya, Saya masukkan angka 3 (Status Stack).

Program akan mengeluarkan status stack saat ini. Tampak dalam tangkapan layar, bahwa kapasitas stack adalah 5 dan masih terisi 0. Selanjutnya, untuk lebih memvalidkan lagi, Saya akan menampilkan data yang tersimpan di dalam stack. Oleh karenanya saya masukkan angka 4 (Tampilkan data dalam Stack).

Dari tangkapan layar di atas, kita menjadi yakin bahwa data masih 0 dan belum ada data yang bisa ditampilkan. Selanjutnya Saya akan mulai memasukkan data berturut – turut: 1, 2, 3, 4, dan 5.

Setelah Saya memasukkan data kelima, Saya lanjutkan dengan mencoba untuk memasukkan data lagi. Tampak program mengeluarkan pesan: Stack Penuh!, kosongkan satu data terlebih dahulu!. Di mana menunjukkan bahwa kapasitas stack sudah penuh. Oleh karena itu, Saya mencoba menampilkan keseluruhan datanya terlebih dahulu. Dengan memasukkan angka 4 (Tampilkan data dalam Stack) maka program akan menampilkan isi stack.

Dapat kita lihat dari tangkapan di atas, data 1, 2, 3, 4, dan 5 ditampilkan secara berurutan oleh Program. Kemudian Saya melanjutkannya dengan melakukan aksi nomor 2 (Keluarkan 1 data dari Stack). Setelah Saya membuang 1 data dari stack, kemudian saya tampilkan lagi datanya. Tampak pada tangkapan layar di atas, program membuat data pada urutan ke – 5 (stack teratas/terakhir). Dengan demikian, Saya dapat memasukkan data lagi ke dalam stack.

Setelah Saya membuang satu data dalam Stack, kini Saya dapat memasukkan data lagi ke dalam Stack. Kemudian, Saya kan membuang seluruh data dalam Stack. Oleh karena itu, Saya memasukkan angka 5 (Bersihkan Stack).

Stack menjadi benar – benar kosong setelah Saya mengosongkannya. Sama sekali tidak ada data yang dapat ditampilkan.

Untuk lebih jelasnya, Anda dapat melihat video di bawah ini.

https://unydevelopernetwork.com/cdn/unydevelopernetwork/JavaStack2.mp4

Dan juga untuk kodingan lengkap program ini, adalah sebagai berikut.

import java.util.InputMismatchException;
import java.util.Scanner;

public class JavaStack {

	private static int[] stack = new int[5];
	private static int counters = 0;

	private static boolean stackStorage() {
		if(counters < stack.length) {
			return true;
		}
		else {
			return false;
		}
	}
	
	private static void createStack() {
		int loopX = 0;
		int alpha = 0;
		while(loopX == 0) {
			System.out.print("Masukkan Data (angka): ");
			Scanner alphaX = new Scanner(System.in);
			try {
				alpha = alphaX.nextInt();
				loopX = 1;
			}
			catch(InputMismatchException e) {
				System.out.println("Masukan harus berupa Angka!");
				loopX = 0;
			}
		}
		stack[counters] = alpha;
		counters++;
	}
	
	private static void removeStack() {
		counters--; 
		System.out.println("Data terakhir dalam stack sudah dikeluarkan");
	}
	
	private static void displayDataStack() {
		System.out.print("Data dalam Stack: ");
		for(int i = 0; i < counters; i++) {
			System.out.print(" ["+i+" => "+stack[i]+"]" );
		}
		System.out.println("");
	}
	
	private static void cleanStack() {
		counters = 0;
	}
	
	private static void quitApp() {
		String quitss = "y";
		System.out.print("Keluar dari Program? (Y/T): ");
		quitss = new Scanner(System.in).nextLine();
		if(quitss.equalsIgnoreCase("y")) {
			System.exit(0);
		}
		else {
			menuProgram();
		}
	}
	
	private static void menuChooser(int choosenMenu) {
		switch(choosenMenu) {
			case 1:
				boolean check = stackStorage();
				if(check) {
					createStack();
				}
				else {
					System.out.println("Stack Penuh!, kosongkan satu data terlebih dahulu!");
				}
				break;
			case 2:
				removeStack();
				break;
			case 3:
				System.out.println("Status Storage: ");
				System.out.println("Kapasitas: " + stack.length);
				System.out.println("Terisi   : " + counters);
				break;
			case 4:
				displayDataStack();
				break;
			case 5:
				cleanStack();
				break;
			case 6:
				quitApp();
				break;
		}
		menuProgram();
	}
	
	private static void menuProgram() {
		int loopX = 0;
		int choosenMenu = 0;
		while(loopX == 0) {
			System.out.println("\nContoh Program Stack dengan Java");
			System.out.println("Menu: ");
			System.out.println("1. Tambah Stack");
			System.out.println("2. Keluarkan 1 data dari Stack");
			System.out.println("3. Status Stack");
			System.out.println("4. Tampilkan data dalam Stack");
			System.out.println("5. Bersihkan Stack");
			System.out.println("6. Keluar dari Program");
			System.out.print("Pilihan Menu (1 - 6) >>> ");
			Scanner menuOption = new Scanner(System.in);
			try {
				choosenMenu = menuOption.nextInt();
				loopX = 1;
			}catch(InputMismatchException e) {
				System.out.println("Masukan harus Angka!");
			}
		}
		System.out.println("");
		menuChooser(choosenMenu);
	}

	public static void main(String[] args) {
		menuProgram();
	}
	
}

Demikian artikel Tutorial: (Struktur Data) Membuat Implementasi Stack Sederhana dengan Java ini. Semoga bermanfaat untuk kita semua. Apabila Anda memiliki pertanyaan, jangan sungkan meninggalkannya di kolom komentar. Jika Anda ingin mencuplik artikel ini, jangan lupa juga sertakan URL nya. Terima Kasih.. ^_^

UNDUH PROJECT

Exit mobile version