Anda di halaman 1dari 10

Praktikum 6 Tumpukan ( Stack )

Tujuan : Setelah melakukan praktikum ini siswa diharapkan mengerti : 1. Cara lain untuk mempresentasikan sekumpulan data menggunakan stack 2. Anggota/element struktur dari sebuah stack dengan array atau linked list 3. Cara penngunaan stack dengan array ataupun dengan linked list 4. Penelusuran simpul /pembacaan stack = LIFO (last in first out) Dasar Teori : Stack bisa diartikan sebagai suatu kumpulan data yang seolah-olah ada data yang diletakkan diatas data yang lain. Perlu dingat, di dalam stack kita bisa menambahkan (menyisipkan) dan mengambil (menghapus) data melalui ujung yang sama yang disebut sebagai ujung atas stack (top of stack). Stack mempunyai sifat LIFO (Last In, First Out), yaitu yang terakhir masuk adalah yang pertama keluar. Bentuk penyajian stack bisa menggunakan tipe data array, tetapi sebenarnya penyajian stack menggunakan array adalah kurang tepat karena banyaknya elemen dalam array adalah statis, sedangkan dalam stack banyaknya elemen sangat bervariasi atau dinamis. Meskipun demikian, array bisa digunakan untuk penyajian stack, tetapi dengan anggapan bahwa banyaknya elemen maksimal dari suatu stack tidak tidak melebihi batas maksimum banyaknya elemen array. Pada suatu saat, ukuran stack akan sama dengan ukuran aaray. Bila diteruskan menambah data, maka akan terjadi overflow. Oleh karena itu, perlu ditambahkan data untuk mencatat ujung stack. Ada dua macam penyajian stack menggunakan array, yaitu single stack dan double stack. 1. Single Stack Stack adalah himpunan elemen yang berurutan dimana bagian paling atas tempat elemen baru tersebut disisipkan disebut top dan pada bagian itu pula elemen tersebut akan diambil dan dihapus dari stack. Karena stack mengalami proses penyisipan dan penghapusan maka stack merupakan salah satu struktur data dinamis. Karena elemen terakhir akan menjadi elemen pertama yang diambil maka stack disebut lifo (last in first out). Operasi penyisipan elemen disebut push sedangkan pangambilan elemen disebut pop. Sebelum operasi pop dilakukan, harus diperiksa dahulu apakah stack tersebut kosong menggunakan fungsi empty(). Jika stack tersebut kosong, maka fungsi empty() akan mengembalikan nilai TRUE dan FALSE jika sebaliknya. Berikut adalah ilustrasi operasi push dan pop yang dilakukan pada suatu stack. Jika ke dalam suatu stack disisipkan huruf A, B, dan C maka stack akan tampak seperti gambar 1.(a). Jika disisipkan 2 elemen lagi yaitu D dan E, stack akan tampak seperti gambar 1.(b). Dan, elemen E dihapus dari stack, maka kondisinya akan seperti gambar 1.(c). E D C B A (b)

C B A (a)

D C B A (c)

(a). Stack berisi 3 elemen (b). Stack setelah 2 elemen disisipkan (c). Stack setelah 1 elemen di hapus 2. Double Stack Double stack merupakan bentuk pengembangan dari single stacj dengan maksud untuk menghemat memori. Prinsip dari double stack adalah dalam satu array terdapat dua stack, TOP 1 TOP 2 STACK 1 STACK 2 stack 1 bergerak ke kanan sedangakan stack 2 bergerak kekiri. Double stack dikatakan penuh apabila top 1 bertemu dengan top 2. deklarasi umum : #define Max 50 #define true 1 #define false 0 Char stack[Max]; Int top1; Int top2; Operasi operasi dasar pada stack adalah sebagai berikut: 1. Operasi menciptakan T sebagai stack kosong Void initializeStack(stack* S) { S-> count=0; } 2. Fungsi yang melakukan pengecekan apakah stack dalam kondisi kosong
Int Empty(Stack *S) { return (S-> count==0); }

3. Fungsi yang melakukan pengecekan apakah stack dalam kondisi penuh


Int Full(Stack *S) { return (S-> count==MAXSTACK); }

4. Operasi menyisipkan element x ke stack T dan mengembalikan stack baru


Void push(item Type x,Stack*s) { If(S->Count=MAXSTACK) Printf(stack penuh!data tidak dapat masuk!); Else { s->Item[S->Count]=x; ++(s->Count); }}

5. Operasi mengambil element puncak stack T,(pop(T,x))


Int pop(stsck*s,Item Type*x) If(s->Count==0) Printf(stack masih kosong); Else { --(S->Count); *x= S->Item[s->Count]; }}

Latihan Percobaan : 1.Mendeklarasiakan ,memasukan data , dan menampilkan pada stack menngunkan array (=penelusuran LIFO)
#include <stdio.h> #include <stdlib.h> #define MAX 10 struct tumpukan { int isi [MAX]; int atas; }; struct tumpukan t; int top; void inisialisasi() { t.atas=0; top=0; } void push(int x) { if(t.atas==MAX) printf("tumpukan sudah penuh"); else {

t.atas=top+1; t.isi[t.atas]=x; top=t.atas; printf("push %d = %d\n", t.atas ,t.isi[t.atas]); }

} void pop() { if(top==0) printf("tumpukan sudah/masih kosong\n"); else{ printf("pop : %d-%d\n",top,t.isi[top]); t.atas=top-1; top=t.atas; } } main() { int i,jml; char strnilai[5],strjum[5]; // inisialisasi(t); printf("JML Data : "); gets(strjum);jml=atoi(strjum); for(i=0;i<jml;i++) { printf("Nilai int %d: ",i+1); gets(strnilai);push (atoi(strnilai)); } printf("data nilai yang telah diinputkan: \n"); for(i=3;i>0;i--) { printf("dataisi = %d\n",t.isi[i]); } for(i=0;i<jml;i++) { pop(); }}

Hasil :

2.Mendeklarasiakan ,memasukan data , dan menampilkan pada stack menngunkan linked list(=penelusuran LIFO)
#include <stdio.h> #include <stdlib.h> #include <string.h> struct tumpukan { int isi; struct tumpukan*next; }; int x,i=1,j=1; struct tumpukan *atas; struct tumpukan *bantu; struct tumpukan *baru; void push(int nilai) { if(j==1) { atas=(struct tumpukan *)malloc (sizeof(struct tumpukan)); atas->isi=nilai; atas->next=NULL; } else { baru=(struct tumpukan *)malloc (sizeof(struct tumpukan)); baru->isi=nilai; baru->next=atas; atas=baru; } j++; } void pop() { bantu=atas; printf("data yang di pop ke %d = %d\n",i,bantu->isi); atas=atas->next; i++; free(bantu); } main() { char jawab[2],strnilai[5]; while(1) { printf("data yang di push di %d = ",j); gets(strnilai); x=atoi(strnilai); push(x); printf("ada data lagi(y/t): "); gets(jawab); if((strcmp(jawab,"Y")==0)||(strcmp(jawab,"y")==0)) continue; else break; } j--; printf("data yang telah diinputkan: \n"); while(atas!=NULL) { pop(); }}

Hasil :

3. Aplikasi stack pada program konversi infix ke postfix Algoritma 1. Inputkan string persamaan dalam notasi infix(=var s) panjang string s (=varN) 2. Sediakan fungsi derajat operator ^=3, *dan/=2 ,+dan - =1 3. Dimulai dari 1=1 s/d N lakukan: - r=s[i]; - test nilai r; a. jika operand : langsung ditilis b. jika operator : - jika tumpukan kosong/derajat r> derajat top stack push operator ke dalam tumpukan - jika tidak pop top stack dan tulis 4.jika notasi infix telah tercapai ,tumpukan belum kosong pop semua isi tumpukan dan tulis hasilnya Contoh: Notasia infix : a+b/cd*e^f 1. tulis a: a 2. push + : + 3. tulis b : ab 4. level /> level+ push / : +/ 5. tulis c :abc 6. level -<level/ pop/,tulis dan push - : +7. tulis d:abc/d 8. level *>level * push ^ :+-* 9. tulis e:abc/de 10. level ^>level * push ^ :+-*/ 11. tulis f:abc/def 12. Sudah karakter \0, tumpukan belu kosong : pop semua isinya dan tulis : abc/def^*-+ 4.Aplikasi program menghitung nilai ekspresi postfix
#include <stdio.h> #include <stdlib.h> #include <string.h> struct tumpukan { char isi; double bil; struct tumpukan*next; }; int x,j=1; char kar; double opdpop; struct tumpukan *atas; struct tumpukan *bantu; struct tumpukan *baru; void push(char opr) { if(j==1) { atas=(struct tumpukan *)malloc(sizeof(struct tumpukan)); atas->bil=0; atas->isi=opr; atas->next=NULL; } else {

baru=(struct tumpukan *)malloc(sizeof(struct tumpukan)); baru->bil=0; baru->isi=opr; baru->next=atas; atas=baru; } j++; } void push2(double hsl) { if(j==1) { atas=(struct tumpukan *)malloc(sizeof(struct tumpukan)); atas->bil=hsl; atas->isi='0'; atas->next=NULL; } else { baru=(struct tumpukan *)malloc(sizeof(struct tumpukan)); baru->bil=hsl; baru->isi='0'; baru->next=atas; atas=baru; } j++; } void pop() { bantu=atas; opdpop=bantu->bil; kar=bantu->isi; atas=atas->next; free(bantu); } int level_operator(char opr) { if(opr=='^') return(3); else if ((opr=='*')||(opr=='/')) return(2); else if ((opr=='+')||(opr=='-')) return(1); else { printf("operator tidak dikenal\n"); return(0); } } double hitung(double a,double b,char opr) { if(opr=='^') return(pow(a,b)); else if(opr=='*') return(a*b); else if(opr=='/') { if (b==0) { printf("pembagian dengan nol"); return(0); } else return(a/b); } else if(opr=='+') return(a+b); else if(opr=='-')

return(a-b); else { printf("operator tidak dikenal\n"); return(0); } } main() { int i,ii,nh,n,pjg,level,temp,pjg2; char hasil[20],input[20],strjwb[2],skar[2]; double opd,opd1,opd2,hasilfx; while(1) { clrscr(); ii=1;nh=0; printf("fungsi="); gets(input); pjg=strlen (input); for(i=0;i<pjg;i++) { //jika operator if(input[i]=='^'||input[i]=='*'||input[i]=='/'||input[i]=='+'||input[i]=='-') { level=level_operator(input[i]); if(ii>1) { if(level<temp) { pop(); nh=nh+1; hasil[nh]=kar; push(input[i]); } else { push(input[i]); } } else { push(input[i]); } temp=level; ii++; } else { nh=nh+1; hasil[nh]=input[i]; } } while(atas!=NULL) { pop(); nh=nh+1; hasil[nh]=kar; } printf("\n"); printf("fungsi postfix=\n"); for(n=1;n<nh;n++) { printf("%4c",hasil[n]); } printf("\n"); //hitung nilai postfix j=1;

hasilfx=0; for(i=1;i<=nh;i++) { //jika operator if(input[i]=='^'||input[i]=='*'||input[i]=='/'||input[i]=='+'||input[i]=='-') { pop(); opd2=opdpop; pop(); opd1=opdpop; hasilfx=hitung(opd1,opd2,hasil[i]); push2(hasilfx); printf("hasil postfix %1f%c%1f=%1f\n",opd1,hasil[i],opd2,hasilfx); } //jika operand else { skar[0]=hasil[i]; skar[1]='\0'; opd=atof(skar); push2(opd); } } while(atas!=NULL) { pop(); printf("hasil postfix total =%1f\n",opdpop); } printf("ada fungsi infix lagi(y/t): "); gets(strjwb); if(strcmp(strjwb,"Y")==0||(strjwb,"y")==0) continue; else break; } }

Hasil :

Tugas 1.Untuk latian no 1 dan 2 buatlah bagan dari proses stack Pada program no 1 dilakukan percobaan memasukkan data pada stack dimana data yang dimasukkan menggunakan array.pada percobaan diatas data yang dimasukkan berupa bilangan 12 kemudian 11 dimana prosesnya sebagai berikut : Pertama dimasukkan jumlah data yang akan diinputkan yaitu 2 kemudian diinputkan 2 nilai 12 kemudian 11,kondisi awal stack masih kosong

Dimasukkan data 12 sehinng index 0 pada top nilainya mnjadi 12

12

top Dilakukan iterasi,sehinng index top 1 bernilai 11 ,index top bergeser pada posisi data yang baru dimasukkan dan dilakukan seterusnya sampai posisi stack penuh dan index top berada paling atas top

11 12

2. Buat program konversi bilangan decimal ke biner,hexadecimal dan octal menggunakan stack
#define TOTAL 100 struct stack{ int isi[TOTAL]; int atas; }; struct stack t; int top, sisa; void inisialisasi(){ t.atas=0; top=0; } void push(int x){ if(t.atas==TOTAL) printf("stack sudah penuh"); else{ t.atas=top+1; t.isi[t.atas]=x; top=t.atas; printf("Push %d = %d\n", t.atas, t.isi[t.atas]); }} void pop(){ if(top==0) printf("stack sudah/ masih kosong\n"); else if(t.isi[top]>=10){ switch(t.isi[top]){ case 10: printf("A"); case 11: printf("B"); case 12: printf("C"); case 13: printf("D"); case 14: printf("E"); case 15: printf("F"); }} else{ printf("%2d", t.isi[top]); t.atas=top-1; top=t.atas; }} void biner(int data){ while(data!=0){ sisa=data%2; push(sisa); data=data/2; }} void oktal(int data){ while(data!=0){ sisa=data%8; push(sisa); data=data/8; }} void hexa(int data){ while(data!=0){ sisa=data%16; push(sisa); data=data/16; }} main(){ int i, jml, data; char dtnilai[5], konversi[5]; inisialisasi(t); printf("Masukkan Nilai desimal :"); gets(dtnilai); data=atoi(dtnilai); printf("\nKonversi ke (biner/hexa/oktal) :"); gets(konversi); if(strcmp(konversi,"biner")==0) biner(data); else if(strcmp(konversi,"hexa")==0) hexa(data); else if(strcmp(konversi,"oktal")==0) oktal(data); printf("\nHasil Konversi adalah :\n"); while(top!=0){ pop(); } getch(); }

Hasil :

Anda mungkin juga menyukai