Selasa, 06 November 2012

Stack (Tumpukan)

Stack atau disebut LIFO (Last In First Out), yaitu elemen yang terakhir disisipkan
Menjadi elemen yang pertama kali diambil. Ini adalah kasus khusus ordered list
Dimana penyisipan dan penghapusan dilakukan disalah satu ujung.
Misal, Stack S=(A1,A2,....An),maka

1. elemen A1 adalah elemen terbawah
2. elemen Ai adalah diatas elemen Ai-1, dimana 1 < I <= n.

Batasan terhadap stack berimplikasi, jika ada elemen A,B,C,D,E maka pengambilan
Seluruh elemen di stack sebagai berikut E,D,C,B,A.

Karakteristik

1. elemen stack ialah item-item data di
    elemen stack
2. Top (elemen puncak dari stack)
3. Jumlah elemen pada stack
4. status stack (kosong/penuh)

Penuh, jika elemen pada stack penuh/mencapai maksimum. Kondisi ini tidak
Memungkinkan menambah elemen, menyebabkan kondisi overflow.

Kosong, jika tidak ada elemen pada stack. Tidak memungkinkan mengambil elemen
Menyebabkan kondisi underflow.

hmmm...contoh stack di dunia nyata seperti, tumpukan kue yang ada didalam keler toples. :D

sumber gambar google image


Operasi pada Stack
1. Create stack
2. Penyisipan elemen pada stack
3. Pengambilan elemen stack
4. Penambahan elemen stack
5. Melihat kondisi pada stack

Penggunaan Stack
1. simulasi tumpukan/stack di dunia nyata
2. pemanggilan fungsi/prosedur
3. implementasi fungsi/prosedur, dan lain-lain

Alhamdulillah pada posting kali ini saya tampilkan program untuk Stack (Pascal Language). Berikut adalah screenshootnya,

Inisialisasi Stack (Membuat Stack Kosong)

Menyisipkan elemen x ke Stack

Melihat isi Stack yang telah terisi elemen

Pengambilan elemen di Stack

Melihat isi Stack yang telah diambil

Menambahkan elemen ke Stack Top (atas)

Melihat isi Stack yang telah ditambahkan

Overflow, jika melebihi batas maksimal banyaknya elemen untuk satu Stack

Bagi yang ingin mencoba dan mengembangkan software nya silahkan copy saja sourcecode dibawah ini. Maaf softwarenya masih berantakan ^_^



program Stack_(Tumpukan);
uses crt;
const n = 6;
type
  TError = (No_Error,Overflow,Underflow,Not_Available);
  TData  = integer; { datanya berupa tipe bilangan  }
  stack  = record
             top : integer;
             SElemen : array [1..n] of TData;
             errorCode : TError;
           end;

var
{ #GLOBAL (for calling procedure/function's parameters }
  sGLOBAL : stack;
  x : TData;
  s : stack;
  empety : boolean;
  sum : byte;
  i : integer;

{ inisialisasi stack }
procedure initS_(var s:stack);
begin
  s.top := 0;
  s.errorCode := No_Error;
end;

{ menyisipkan item x ke stack }
procedure push_(var s:stack; x:TData);
begin
  if (s.top < n) then
    begin
      s.top := s.top + 1;
      s.SElemen[s.top] := x;
    end
  else
    begin
      s.errorCode := Overflow;
    end;
end;

{ hilangkan elemen puncak dari stack kecuali bila stack kosong }
procedure pop_(var s:stack; var x:TData);
begin
  if (s.top > 0) then
    begin
      x := s.SElemen[s.top];
      s.top := s.top - 1;
    end
  else
    begin
      s.errorCode := Underflow;
    end;
end;

{ mengirim elemen puncak dari stack kecuali bila stack kosong }
function topS_(s:stack; x:TData):TData;
begin
  if (s.top > 0) then
    begin
      topS_ := s.SElemen[s.top] ;
      {add}
      s.SElemen[s.top] := x;
      sGLOBAL.top := sGLOBAL.top + 1;
      {/add}
    end
  else
    begin
      s.errorCode := Not_Available;
    end;
end;

{ tes, apakah stack kosong? }
function empetyS_(s:stack):boolean;
begin
  empetyS_ := (s.top = 0);
end;

{ jumlah elemen di stack }
function sum_in_S_(s:stack):integer;
begin
  sum_in_S_ := s.top;
end;

procedure menu_of_stack_;
var choose : char;
    i,n_elemen : byte;
begin
  while true do
    begin
      textcolor(15);clrscr;
      writeln('############## STACK ##############');
      writeln('-----------------------------------');
      writeln('[1] Inisialisasi Stack');
      writeln('[2] Menyisipkan Elemen ke Stack');
      writeln('[3] Mengambil Elemen dari Stack');
      writeln('[4] Menambahkan Elemen ke Stack');
      writeln('[5] Melihat isi Stack');
      {writeln('[6] Jumlah Elemen di Stack');}
      writeln('[X] Keluar Program');
      writeln('===================================');
      write('Choose : ');readln(choose);
      if (choose = '1') then
        begin
          initS_(sGLOBAL);
          gotoXY(1,10);textcolor(10);write('>>>>>>  Inisialisasi Sukses  <<<<<<');delay(2400);
        end
      else if (choose = '4') then
        begin
          clrscr;
            writeln('####### Mengirim Elemen Puncak #######');
            writeln('--------------------------------------');
            {writeln;write('Masukkan Elemen = ');readln(x);
            {sGLOBAL.SElemen[sGLOBAL.top] := sGLOBAL.SElemen[sGLOBAL.top];}
            topS_(sGLOBAL,x);
            writeln;writeln('>>>>>> Elemen Sukses dikirim <<<<<<');writeln;
            textcolor(10);write('Enter = Go to Main Menu');readln;
        end
      else if (choose = '2') then
        begin
          repeat
            clrscr;
            writeln('###### Sisipkan Elemen ke Stack ######');
            writeln('--------------------------------------');
            write('Banyaknya Elemen [Max 5] > ');readln(n_elemen);
          until (n_elemen > 0) and (n_elemen < 6);
          for i := 1 to n_elemen do
            begin
              write('Elemen ke-',i,' = ');readln(x);
              push_(sGLOBAL,x);
            end;
        end
      else if (choose = '3') then
        begin
          clrscr;
            writeln('# Mengambil Elemen Puncak dari Stack #');
            writeln('--------------------------------------');
            pop_(sGLOBAL,x);
            writeln;write('>>>>>>> ');textcolor(15+blink);write('Elemen Sukses diambil');textcolor(15);write(' <<<<<<<');
            writeln;writeln;textcolor(10);write('Enter = Go to Main Menu');readln;
        end

      else if (choose = '5') then
        begin
          clrscr; textcolor(11);
          writeln('########### Isi dalam Stack ###########');
          writeln('---------------------------------------');
          empetyS_(sGLOBAL);
          if (empetyS_(sGLOBAL) = FALSE) then
            begin
              if sum_in_S_(sGLOBAL) <= n-1 then
                begin
                  sum_in_S_(sGLOBAL);
                  writeln('Jumlah Elemen = ',sum_in_S_(sGLOBAL));
                  for i := sGLOBAL.top downto 1 do
                    begin
                      write(sGLOBAL.SElemen[i]:3);
                    end;
                end
              else
                begin
                  writeln('Overflow!');
                end;
            end
          else
            begin
              gotoXY(13,3);textcolor(15);write('-');
              textcolor(4+blink);gotoXY(15,3);writeln('Stack Kosong');
              gotoXY(28,3);textcolor(15);writeln('-');
            end;
          writeln;textcolor(10);write('Enter = Go to Main Menu');
          readln;
        end
      {else if (choose = '6') then
        begin
          clrscr; textcolor(11);
          writeln('####### Jumlah Elemen di Stack #######');
          writeln('--------------------------------------');
          sum_in_S_(sGLOBAL);
          writeln('Jumlah Elemen = ',sum_in_S_(sGLOBAL));writeln;
          write('Enter = Go to Main Menu');readln;
        end}
      else if (choose = 'x') then begin exit end;
    end;
end;

{ Program Utama }
begin
  menu_of_stack_;
end.

Tidak ada komentar:

Posting Komentar