Anda di halaman 1dari 10

Nama : Anak Agung Istri Putri Candra Sari

NIM : 1308605001
MODUL 2
STACK
Contoh Program a


Dalam program diatas terdapat tampilan implementasi stack dalam Input data dengna ketentuan
bila data yang diinput >=30 maka periksa kondisi stack. Bila stack masih bisa diisi, maka
simpan data tersebut (PUSH) kedalam stack,dan proses diulang kembali mulai no.1. tapi bila
stack sudah penuh, data tidak jadi disimpan, kemudian cetak perkataan Stack Penuh, dan
proses selesai. Bila data yang diinput <30, maka periksa kondisi stack. Bila stack ada isinya,
maka ambil isi stack dan cetak ke layar, kemudian proses diulang kembali mulai no.1. Bila
stack tak ada isinya, maka cetak perkataan Stack Kosong, dan proses selesai. Dalam contoh
program diatas tidak terdapat kesalahan sehingga tidak menemukan masalah.
Jadi hasil running yang dapat ditampilkan sebagai berikut
Menginput 1 maka stack kosong

menginput 999 maka input dan push selesai maka ditulis 0

Menginput lebih dari atau sama dengan 30 stack terisi apabila menginput 0 maka diambil top di
yaitu 40 lalu menginput 3 maka diambil top di stack yaitu 30 lalu pada akhirnya stack kosong














Contoh Program b

Contoh program diatas memerlukan array 1 dimensi yang akan digunakan sebagai stack
sebanyak 10 element, bertipe integer. Kemudian inputkan data (nilai numerik) dan simpan
(PUSH) ke stack S. Proses input dan PUSH selesai bila data yang diinputkan bernilai =999,
atau Stack S penuh. (Nilai 999 dipakai sebagai end of data, tidak ikut di PUSH ke stack S).
setelah itu keluarkan (POP) isi stack dan cetak ke layar satu persatu sampai stack menjadi
kosong. Selama dalam proses stack ini tidak dapat kesalahan maka tidak ada masalah.maka
hasil running dapat ditampilkan sebagai berikut

Menginput nilai sampai baris ke 11 maka akan berhenti lalu stack penuh sehingga pada input
& push selesai akan ditampilkan dari baris ke-10 karena aray yang dibatasi 10.























Tugas

#include<stdio.h>
#include<conio.h>
#define max 50

int cek_opt(char ch);
int prioritas (char opt);

void main()
{
char exp[100],opt_stk[max],ch;
int opt_top,i;
system("cls");
opt_top=-1;
printf("\nMasukan infix : ");
gets(exp);
printf("Postfix : ");

for(i=0;exp[i]!='\0';i++)
{
if (exp[i]=='(')
{
push_opt(opt_stk,&opt_top,&exp[i]);
}
else if (exp[i]==')')
{
//selama opt stk berada pada top operator tidak bisa
dibuka
//kurungkan pop operator dan tampilkan ke layar
while(opt_stk[opt_top]!= '(')
{
pop_opt(opt_stk,&opt_top,&ch);
printf("%c",ch);
}
pop_opt(opt_stk,&opt_top,&ch);
}
else
if (cek_opt(exp[i])==0)
printf("%c",exp[i]);
else
{
if(opt_top==-1) //opt stack kosong
{
push_opt(opt_stk,&opt_top,&exp[i]);
}
else
if (prioritas(exp[i]) > prioritas(opt_stk[opt_top]))
{
push_opt(opt_stk,&opt_top,&exp[i]);
}
else
{
while (prioritas
(exp[i])<=prioritas(opt_stk[opt_top]))
{
if (opt_top == -1)
break;
pop_opt(opt_stk,&opt_top,&ch);
printf("%c",ch);
}
push_opt(opt_stk,&opt_top,&exp[i]);
}
}
}
while(opt_top!=-1)
{
pop_opt(opt_stk,&opt_top,&ch);
printf("%c",ch);
}//while
printf("\n");
}

//mengecek karakter yang diberikan adalah operator atau tidak
//Return 1 jika operator selain itu return 0
int cek_opt(char ch)
{
switch(ch)
{
case '^':
case '*':
case '/':
case '%':
case '+':
case '-': return(1);
default : return(0);
}
}

//
int prioritas (char opt)
{
switch(opt)
{
case '^' : return(4);
case '*' :
case '/' :
case '%' : return(3);
case '+' :
case '-' :return(2);
case '(' : return(1);
default : return (0);
}//switch
}//prioritas

//Push operator(ch) di dalam opt_stack
int push_opt(char opt_stk[max],int *opt_top,char *ch)
{
if(*opt_top==max-1)
{
return(-1);
}
else
{
(*opt_top)++;
opt_stk[*opt_top]=*ch;
return(1);
}
}
//Pop operator(ch) di dalam opt_stack
int pop_opt(char opt_stk[max],int *opt_top,char *ch)
{
if (*opt_top==-1)
{
return(-1);
}
else
{
*ch=opt_stk[*opt_top];
(*opt_top)--;
return(1);
}
getch();
}


Program diatas adalah untuk menginput infix lalu merubahnya ke dalam postfix sebagai program
implementasi stack dengan cara mengecek apakah itu operator atau operan. Dalam operator perlu
mengdeklarasikan variabel prioritas dalam mengecek urutannya dari yang terbesar ialah ^, /, *,+,-.
Dalam program Return 1 jika operator selain itu return 0.
Berikut ini langkah-langkahnya:
1. Proses akan dilakukan dari kiri ke kanan
2. Bila yang diproses adalah operand, maka tulis di hasil. Di sini operand A:
A * ( B + C ) / D ^ E F





Stack Hasil = A
3. Lanjutkan ke operator *, karena stack masih dalam keadaan kosong, maka
masukkan operator tersebut ke dalam stack;

A * ( B + C ) / D ^ E F




*
Stack Hasil = A

4. Lanjutkan ke operator (, operator ini masukkan (tumpuk) saja ke dalam stack;
A * ( B + C ) / D ^ E F


(
*
Stack Hasil = A
5. Lanjutkan ke operand B, karena sebagai operand, maka B dijadikan hasil saja.

A * ( B + C ) / D ^ E F


(
*
Stack Hasil = A B
6. Lanjutkan ke operator +, operator ini masukkan (tumpuk) saja ke dalam stack;

A * ( B + C ) / D ^ E F

Bila top stack (posisi teratas tumpukan) adalah ( maka apapun operator
yang sedang diproses, masukkan saja ke dalam stack.


+
(
*
Stack Hasil = A B
7. Lanjutkan ke operand C, karena sebagai operand, maka C dijadikan hasil saja.

A * ( B + C ) / D ^ E F


+
(
*
Stack Hasil = A B C
8. Lanjutkan ke operator ), operator ini akan mengeluarkan seluruh isi stack
(mulai dari atas) hingga bertemu operator ( yang menjadi pasangannya. Karena
di antara ( dan ) hanya ada + maka + saja yang dijadikan hasil. Tanda
kurung dibuang saja.

A * ( B + C ) / D ^ E F



*
Stack Hasil = A B C +
9. Lanjutkan ke operator /, operator ini akan dimasukkan ke dalam stack. Karena
di top stack sudah ada isinya, maka bandingkan keduanya. Bila yang akan masuk
memiliki derajat yang lebih besar, maka tumpuk saja. Sebaliknya, bila yang akan
masuk memiliki derajat yang sama atau lebih kecil, maka keluarkan top stack
hingga operator yang berada di top stack berderajat lebih kecil dari operator yang
akan masuk.

Karena / berderajat sama dengan * maka keluarkan top stack (*). Karena
stack sudah hampa, maka operator / dimasukkan ke dalam stack sebagai top
stacknya.
A * ( B + C ) / D ^ E F



/
Stack Hasil = A B C + *

10. Lanjutkan ke operand D, karena sebagai operand, maka D dijadikan hasil
saja.

A * ( B + C ) / D ^ E F




/
Stack Hasil = A B C + * D

11. Lanjutkan ke operator ^, operator ini akan dimasukkan ke dalam stack.
Karena di top stack sudah ada isinya, maka bandingkan keduanya. Karena ^
berderajat lebih besar dari top stacknya (/) maka masukkan (tumpuk) saja.
A * ( B + C ) / D ^ E F


^
/
Stack Hasil = A B C + * D
12. Lanjutkan ke operand E, karena sebagai operand, maka E dijadikan hasil
saja.

A * ( B + C ) / D ^ E F


^
/
Stack Hasil = A B C + * D E
13. Lanjutkan ke operator -, operator ini akan dimasukkan ke dalam stack.
Karena di top stack sudah ada isinya, maka bandingkan keduanya. Karena -
berderajat lebih kecil dari ^ maka operator ^ dikeluarkan dari tumpukan dan
dijadikan hasil.

Ketika - akan masuk, di top stack kini ada / yang berderajat lebih besar dari -,
akibatnya top stack (/) dikeluarkan juga dan dijadikan hasil. Kini - menjadi top
stacknya.
A * ( B + C ) / D ^ E F





Stack Hasil = A B C + * D E ^ /

14. Lanjutkan ke operand F, karena sebagai operand, maka F dijadikan hasil
saja.
A * ( B + C ) / D ^ E F




Stack Hasil = A B C + * D E ^ /

15. Karena proses telah selesai, maka keluarkan seluruh isi stack mengikuti
kaidahnya, last in first out. Karena hanya ada - maka hasil akhirnya menjadi:
A B C + * D E ^ / F
Hasil ini harus sama dengan postfix yang menggunakan cara manual. Terlihat
langkahnya lebih panjang dari cara manual, namun jika telah terbiasa, cara ini
dapat dilakukan dengan lebih mudah dari pada cara manual. Kalau dipersingkat,
bentuknya menjadi:

Hasil running
Ketika infix : 12 + 3 = 4
Maka postfix : 123+4-