Implementasi Struktur Data Stack

Implementasi Struktur Data Stack

Dalam tutorial ini kita akan mengimplementasikan data structure stack yang paling umum dengan menggunakan Array. Namun stack juga dapat diimplementasikan dengan LinkedList.

Catatan: Perlu diketahui, setiap teknologi bahasa pemograman seperti java php c++ c# dll. memiliki implementasi data structure yang sudah disediakan yang bisa kita gunakan. Data structure ini dikenal dengan istilah Collections.

Apa Itu Stack

Stack adalah jenis linear data structure yang populer digunakan, stack mempunyai prinsip LIFO(Last In Frist Out) dimana data yang terakhir masuk pertama kali keluar.

Stack dapat dibayangkan seperti tumpukan buku didalam kotak yang memiliki satu ruang untuk masuk dan keluar. Dalam istilah stack untuk menyimpan data dalam tumpukan dikenal dengan istilah push dan untuk mengeluarkan data didalam tumpukan dikenal dengan pop.


Operasi Dasar Stack

Berikut ini beberapa operasi dasar yang diterapkan dalam data structure stack.

  • push: operasi ini digunakan untuk menambah data didalam stack
  • pop: operasi ini digunakan untuk mengeluarkan data didalam stack
  • isEmpty: operasi ini mengembalikan boolean true, jika data dalam stack kosong
  • isFull: operasi ini mengembalikan boolean true, jika data dalam stack penuh
  • peek: operasi ini digunakan untuk mengintip data dalam tumpukan terakhir
  • clear: operasi ini akan menghapus semua data dalam stack

C# Implementasi Stack Dengan Array

Memulai dengan membuat sebuah class Stacks

  • int[] stack; sebagai media penyimpanan stack
  • int top = -1; digunakan untuk melacak elemen teratas. Menginisialisasi dengan nilai -1 yang artinya elemen stack masih kosong
class Stacks { private int[] stack; private int top = -1; public Stacks() { this.stack = new int[10]; } public Stacks(int size) { this.stack = new int[size]; } }

Implementasi Method IsFull() :

Method ini Mengembalikan true jika elemen stack penuh

  • Jika nilai top bernilai sama dengan panjang array stack, kembalikan true
  • Selain dari itu kembalikan false
private bool IsFull() { return top == (stack.Length - 1); }

Implementasi Method RisizeIfFull()

  • Jika array stack full
    • simpan elemen sebelumnya didalam array temporary
    • lakukan risize panjang array
    • simpan kembali elemen yang berada di array temporary kedalam array yang sudah di risize
  • Jika belum full abaikan
private void RisizeIfFull() { if(IsFull()) { int[] temp = stack; //simpan elemen sebelumnya dalam array temporary stack = new int[stack.Length * 2]; //melakukan resize for (var i = 0; i < temp.Length; i++) stack[i] = temp[i]; } }

Implementasi Method IsEmpty()

  • Jika nilai top sama dengan -1: artinya stack kosong kembalikan boolean true
public bool IsEmpty() { return top == -1; }

Implementasi Menambah Elemen Method Push()

  • lakukan risize jika stack penuh
  • masukkan elemen didalam stack dengan top bernilai + 1
public void Push(int data) { RisizeIfFull(); stack[++top] = data; }

Berikut keseluruhan kode class Stacks

class Stacks { private int[] stack; private int top = -1; public Stacks() { this.stack = new int[10]; } public Stacks(int size) { this.stack = new int[size]; } private bool IsFull() { return top == (stack.Length - 1); } private void RisizeIfFull() { if(IsFull()) { int[] temp = stack; stack = new int[stack.Length * 2]; for (var i = 0; i < temp.Length; i++) stack[i] = temp[i]; } } public bool IsEmpty() { return top == -1; } public void Push(int data) { RisizeIfFull(); stack[++top] = data; } public bool Pop() { if(!IsEmpty()) { stack[top] = 0; top--; return true; } else { Console.WriteLine("Stack IS Empty!"); } return false; } public int Peek() { return (!IsEmpty()) ? stack[top] : -1; } public bool Clear() { if(!IsEmpty()) { for(var i = top; i >= 0; i--) { stack[top] = 0; top--; } return true; } return false; } public void Display() { if(!IsEmpty()) { foreach(var i in stack) { Console.Write(i+" => "); } } else { Console.WriteLine("Stack IS Empty.!"); } } } namespace Datastructure { class Program { private static Stacks stack = new Stacks(2); static void Main(string[] args) { ViewMain(); } private static void ViewMain() { while(true) { Console.WriteLine(); Console.WriteLine("[1]. Push\n" + "[2]. Pop\n" + "[3]. Display\n" + "[4]. Clear"); try { Console.Write("Input Your Choose > "); byte pilihan = Convert.ToByte(Console.ReadLine()); switch (pilihan) { case 1: ViewPush(); break; case 2: ViewPop(); break; case 3: ViewDisplay(); break; case 4: ViewClear(); break; default: Console.WriteLine("Your choose not found"); break; } } catch(Exception er) { Console.WriteLine(er.Message); } } } private static void ViewPush() { try { Console.Write("Input Data Stack: "); int data = Convert.ToInt32(Console.ReadLine()); stack.Push(data); } catch(Exception er) { Console.WriteLine(er.Message); } } private static void ViewPop() { string result = (stack.Pop()) ? "Pop success" : "Pop Fail"; Console.WriteLine(result); } private static void ViewDisplay() { stack.Display(); } private static void ViewClear() { string result = (stack.Clear()) ? "Clear success" : "Clear Fail"; Console.WriteLine(result); } } }

#Java Implementasi

public class Stack { private int[] data; private int top = -1; public Stack() { data = new int[10]; } public Stack(int size) { this.data = new int[size]; } /*@return boolen true, jika stack kosong*/ public boolean isEmpty() { return top == -1; } /*@return boolean true, jika stack penuh*/ private boolean isFull() { return top == data.length - 1; } /*logic penyisipan elemen stack*/ public void push(int elemen) { if(!isFull()) { data[++top] = elemen; } else { System.out.println("cannot push elemen "+elemen+", because stack is full"); } } /*logic mengakses elemen stack*/ public int pop() { int element = -1; if(!isEmpty()) { element = data[top--]; return (element); } else { return (element); } } /*logic mengintip elemen paling atas dalam stack*/ public int peek() { return (!isEmpty()) ? data[top] : -1; } /*logic menghapus semua elemen stack*/ public boolean removeAll() { if(!isEmpty()) { while(top >= 0) { data[top] = 0; top--; } return true; } return false; } public void display() { if(!isEmpty()) { for(var i = top; i >= 0; i--) { System.out.println(data[i]); } } else { System.out.println("stack empty"); } } }