Saturday, 21 March 2020

STACK AND QUEUE

STACK

Stack merupakan jenis linked list yang menerapkan konsep LIFO (Last In Fist Out) artinya elemen dari struktur (node) yang dimasukkan pertama kali ke dalam rangkaian akan dikeluarkan (diproses) terakhir kali sedangkan elemen yang masuk terakhir akan diproses / dikeluarkan pertama. Dengan kata lain setiap transaksi atau aktifitas yang ada dalam stack dilakukan pada kepalanya (head) saja. Pada stack hanya ada 2 fungsi utama yaitu Push atau menambah/memasukkan node (struktur) ke dalam stack, dan Pop atau mengeluarkan/menghapus node dari stack.
cara kerja stack dapat di ilustrasikan sebagai berikut:

| D | ---> atas
| C |
| B |
| A | ---> bawah

Anggaplah gambar diatas sebagai tumpukan data, D sebagai node(struktur) yang atas (terkhir dimasukkan) dan A sebagai node yang bawah (pertamakali dimasukkan). Jika kita melakukan operasi Push (menambah), misalnya E, maka penambahan akan dilakukan pada nilai yang paling atas, yaitu D, sehingga menjadi
| E | ---> atas
| D |
| C |
| B |
| A | ---> bawah

Sehingga nilai E menjadi nilai atas yang baru, dan jika dilakukan operasi pop, maka stack akan menjadi seperti gambar yang pertama diatas, yaitu nilai D menjadi nilai atas, dan nilai E akan dihapus dari tumpukan (stack).
Contoh kodingan yang paling umum

#include <stdio.h>
#define MAX 5

int top;

/*Fungsi PUSH*/
void push (int stack[], int item)
{   
 if (top == (MAX-1))
  printf("\nStack Full");
    else
    {   
  ++top;
  stack [top] = item;
    }
}

/*Fungsi POP*/
int pop (int stack[])
{  
 int ret;

    if (top == -1)
    {
  ret = 0;
    } else {

  ret = stack [top];
  --top;
    }

 return ret;
}

/*Fungsi Display*/
void display (int stack[])
{   int i;
    printf ("\nIsi Stack: ");
    if (top == -1){
     
     printf ("\nStack Kosong\n\n");
    } else {   
  
  for (i=top; i>=0; --i)
     printf ("\n--------\n|%3d   |\n--------", stack[i]);
    }
    printf ("\n");
}

/*Main Program*/
int main()
{  
 int stack[MAX], item;
    int pilihan;
    
    top = -1;

    do
 {
  do
  {
   printf ("MAIN MENU\n");
   printf ("1.Push / Insert Stack\n");
   printf ("2.POP / Delete Stack\n");
   printf ("3.Exit\n");
   printf ("Pilihan: ");
   scanf  ("%d", &pilihan);
   
     if (pilihan<1 || pilihan>3)
        printf ("\nPilhan Salah, Silahkan Ulangi Lagi.");
        
  } while (pilihan<1 || pilihan>3);
       
    switch (pilihan)
    {
     case 1:
     printf ("\nElemen Push : ");
     scanf  ("%d", &item);
    
     push (stack, item);
     
     display (stack);
     
     break;
   
        case 2:
     item = pop (stack);
     
     if(item == 0){
       
       printf("\nStack Kosong\n\n");
     } else {
     
       display (stack);
     }
          
     break;
  
  default:
     printf ("\nExit");
          }
    } while(pilihan != 3);

 return 0;
}


  QUEUE

Queue merupakan jenis Linked list yang menerapkan konsep FIFO (First In First Out) atau kebalikan dari Stack (LIFO). pada Queue elemen yang dimasukkan pertama kali apabila dilakukan pemrosesan makan elemen tersebut yang akan diproses terlebih dahulu. ilustrasinya seperti saat kita akan membeli tiket di Bioskop, disitu orang yang datang untuk mengantri pertama kali akan dilayani terlebih dahulu dan yang mengantri terakhir akan dilayani terakhir.

Fungsi dasar queue sebagai berikut : 
  • Menginisialisasi queue menjadi empty queue.
  • Menentukan / memastikan apakah queue dalam keadaan penuh ( is full) atau kosong (is Empty).
  • Apabila queue belum penuh, maka data baru akan insert ke pada bagian ujung pangkal queue, dan jika queue kososng, maka remove dari data bagian ujung depan queue.

Terdapat 2 Operasi dasar dari Queue:

  • Enqueue: proses penambahan elemen di posisi belakang
  • Dequeue: proses pengambilan elemen di posisi depan Selain operasi dasar di atas,

Contoh kodingan queue paling umum dalam bahasa C 
#include <stdio.h>
#define MAX 10
typedef struct
{
 int Item [MAX];
 int Front;
 int Rear;
 int Count;
}

Queue;

void Inisialisasi(Queue *q)
{
 q->Front = q->Rear = -1;
 q->Count = 0;
}
void Tambah (Queue *q, int item)
{
 if ((q->Rear == MAX-1 && q->Front == 0) || (q->Rear + 1 == q->Front))
 {
  printf ("\nAntrian Penuh");
  return;
 }
if (q->Rear == MAX - 1)
q->Rear = 0;
else
q->Rear++;
q->Item[q->Rear] = item; q->Count++;

if (q->Front == -1) q->Front = 0;
}
int Hapus (Queue *q)
{
 int data ;
 if (q->Front == -1)
 {
  printf("\nAntrian Kosong");
  return NULL;
 }
 else
 {
  data = q->Item[q->Front];
  q->Count--;
  if (q->Front == q->Rear)
  q->Front = q->Rear = -1;
  else
  {
   if (q->Front == MAX-1)
   q->Front = 0;
   else
   q->Front++;
  }
 }
 return data;
}
void Tampil(Queue *q)
{
 for(int i=0; i<q->Count; i++)
 printf("\nData : %d", q->Item[i]);
}
main()
{
 Queue q;
 int data;
 Inisialisasi (&q);
 Tambah (&q,11);
 Tambah (&q,12);
 Tambah (&q,13);
 Tambah (&q,14);
 Tambah (&q,15);
 Tambah (&q,16);
 Tambah (&q,17);
 Tambah (&q,18);
 Tambah (&q,19);
 Tambah (&q,20);
 Tambah (&q,21);
 Tampil (&q);
data = Hapus(&q);
printf("\nHapus Item = %d ", data); data = Hapus(&q);
printf("\nHapus Item = %d ", data); data = Hapus(&q);
printf("\nHapus Item = %d ", data); Tampil(&q);
}

No comments:

Post a Comment