Pertemuan ke 3 - Stack and Queue - 2101662032 - Arya Surya Sabara Cia


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.

Stack dalam Bahasa C
Stack dalam Bahasa C
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 Program Stack dalam Bahasa C

Contoh Program Stack dalam Bahasa C


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.

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,

Dalam Implementasinya terdapat 3 Alternatif Implementasi dalam Queue:

Queue Alternatif 1:

Queque Alternatif 1

Queque Alternatif 1


Queue Alternatif 2:

Queque Alternatif 2

Queque Alternatif 2

Queque Alternatif 2

Queque Alternatif 2


Queue Alternatif 3:

Queque Alternatif 3

Queque Alternatif 3

Queque Alternatif 3

Queque Alternatif 3

Queque Alternatif 3

Queque Alternatif 3

Queque Alternatif 3


Contoh Program Queue dalam Bahasa C

Queue Alternatif 1:

drvqueue1.c
#include "queue1.h"

int main()
{
    int max,i,x,y,j;
    Queue F;

    printf("======================================\n");
    printf("===== Program Queue Alternatif 1 =====\n");
    printf("======================================\n\n");

    printf("Input Max element dari queue F : "); scanf("%d",&max);
    CreateEmpty(&F,max);

    printf("IsFull? %d\n",IsFull(F));
    printf("IsEmpty? %d\n\n",IsEmpty(F));

    printf("Inputkan jumlah elemen yang akan dimasukkan : ");
    scanf("%d",&j);
    for(i=1;i<=j;i++){
        printf("Input nilai [%d] : ",i); scanf("%d",&x);
        Add(&F,x);
    }
    printf("\nIsi F: \n");

    printf("\nCek posisi HEAD : %d\n",F.Head);
    printf("Cek posisi TAIL : %d\n",F.Tail);
    printf("Cek jumlah elemen : %d\n",NBElmt(F));
    printf("IsFull? %d\n",IsFull(F));
    printf("IsEmpty? %d\n",IsEmpty(F));

    printf("\nElemen pertama keluar (First In First Out)....\n");
    Del(&F,&y);
    printf("Nilai yang keluar adalah : %d\n",y);
    printf("\nIsi F: \n");

    printf("\nCek posisi HEAD : %d\n",F.Head);
    printf("Cek posisi TAIL : %d\n",F.Tail);
    printf("IsFull? %d\n",IsFull(F));
    printf("IsEmpty? %d\n",IsEmpty(F));
    printf("Cek jumlah elemen : %d\n",NBElmt(F));
    DeAlokasi(&F);

    return 0;
}


queue1.c
#include "queue1.h"
boolean IsEmpty (Queue Q)
{
    if(HEAD(Q)==Nil&&TAIL(Q)==Nil)
    {
        return true;
    }else{
        return false;
    }
}
boolean IsFull (Queue Q)
{
    if(HEAD(Q)==1&&TAIL(Q)==MaxEl(Q))
       {
           return true;
       }else{
            return false;
       }
}
int NBElmt (Queue Q)
{
    int jumlah;
    if(IsEmpty(Q))
    {
        jumlah=0;
    }else{
        jumlah=TAIL(Q);
    }
    return jumlah;
}
void CreateEmpty (Queue *Q, int Max)
{
    (*Q).T=(infotype *)malloc((Max+1)*sizeof(infotype *));          //mengalokasikan memori untuk q.t sebanyak max+1
    if ((*Q).T != NULL)                                                 //jika berhasil maka maxel di isi maxnya head&tail dibuat nil
{
        MaxEl(*Q) = Max;
        HEAD(*Q)=Nil;
        TAIL(*Q)=Nil;
    }else{                                                                //kalo gagal maxel dibuat kosong/nil
        MaxEl(*Q) = Nil;
    }
}
void DeAlokasi (Queue *Q)
{
    free((*Q).T);                                                   //membuat dealokasikan memori yang dipesan
    MaxEl(*Q) = Nil;                                            // maxelnya di nilkan atau dibuat ke awalnya
}
void Add (Queue *Q, infotype X)
{
    if(IsEmpty(*Q))                                            //kalo queue masih kosong maka langsung diinputkan
    {
        HEAD(*Q)=1;TAIL(*Q)=1;                                  //index/address head dan tail di set ke 1
        InfoTail(*Q)=X;                                           //q.t[q.tail]/(q.t[1])index yang pertama diisi elemen X
    }else{                                                      //jika *q tidak kosong maka dicek apakah queuenya penuh.
        if(IsFull(*Q))
        {
            printf("\nQUEUEnya penuh...");
        }else {                                                  //jika tidak TAIL(Q)(q.tail) ditambah/diincrementkan
            TAIL(*Q)++;
            InfoTail(*Q)=X;                                  // setelah TAIL(Q) di incrementkan maka infotail(Q) diisikan elemen
        }
    }
}
void Del (Queue *Q, infotype *X)
{
    int i;
    if(IsEmpty(*Q))                         //jika kosong maka infokan ke user
   {
       printf("\nQUEUEnya Kosong...");
   }else{                                   //jika tidak maka infohead(q)/elemen pertama queue disimpan sementara ke variabel *X
        (*X)=InfoHead(*Q);                  //TAILnya dikkurangi/decrementkan
        TAIL(*Q)--;
        if(TAIL(*Q)==0)                     //jika setelah didecrementkan tailnya kosong maka headnya dibuat kosong juga
        {
            HEAD(*Q)=0;
        }else{                              //kl tidak maka isi queue dari head+1 sampai tail digeser ke kiri
                i=1;
                while(i<=TAIL(*Q))
                {
                    (*Q).T[i]=(*Q).T[i+1];
                    i++;
                }

        }
   }
}


queue1.h
#ifndef QUEUE1_H_INCLUDED
#define QUEUE1_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include "boolean.h"

#define Nil 0

typedef int infotype;
typedef int address;

typedef struct{
    infotype *T;
    address Head;
    address Tail;
    int MaxEl;
}Queue;

/********** AKSES (Selektor) **********/
/* Jika Q adalah Queue, maka akses elemen : */
#define HEAD(Q) (Q).Head
#define TAIL(Q) (Q).Tail
#define InfoHead(Q) (Q).T[(Q).Head]
#define InfoTail(Q) (Q).T[(Q).Tail]
#define MaxEl(Q) (Q).MaxEl

boolean IsEmpty (Queue Q);
boolean IsFull (Queue Q);
int NBElmt (Queue Q);
void CreateEmpty (Queue *Q, int Max);
void DeAlokasi (Queue *Q);
void Add (Queue *Q, infotype X);
void Del (Queue *Q, infotype *X);

#endif // QUEUE1_H_INCLUDED



2101662032 - ARYA SURYA SABARA CIA

Komentar

Postingan populer dari blog ini

Pertemuan ke 4 - Tree - 2101662032 - Arya Surya Sabara Cia

Pertemuan ke 2 - Single dan Double Linked List - 2101662032 - Arya Surya Sabara Cia