Contoh Percobaan dan Latihan Program C++(Stack)
~~Selamat Membaca~~
A. Contoh Dasar Dari Program Stack dalam C++
Percobaan 1
: Penerapan Fungsi-Fungsi Tumpukan, Memasukkan Isi Tumpukan & Menampilkan
Isi Tumpukan
Berikut Contoh Source Code nya:
#include <stdio.h>
#define MAXSTACK 5
typedef int ItemType;
/* Definisi struktur stack */
typedef struct
{
int
Item[MAXSTACK]; /* Array yang berisi data tumpukan */
int Count; /*
menunjukkan indeks data paling atas dari stack*/
}
Stack;
void InitializeStack(Stack *S)
{
S->Count =
0;
}
int Empty(Stack *S)
{
return
(S->Count == 0);
}
int Full(Stack *S)
{
return
(S->Count == MAXSTACK);
}
void Push(ItemType x, Stack *S)
{
if
(S->Count==MAXSTACK)
printf("Stack penuh! Data tidak dapat
masuk!");
else
{
S->Item[S->Count]=x;
++(S->Count);
}
}
int Pop(Stack *S)
{
if
(S->Count==0)//stack kosong
printf
("Stack masih kosong!");
else
{
--(S->Count);
return
(S->Item[S->Count]);
}
}
int main()
{
int i,input;
Stack tumpukan;
InitializeStack(&tumpukan);
for
(i=0;i<MAXSTACK;i++)
{
printf
("Masukkan isi stack ke- %d : ",i+1);
scanf("%d",&input);
Push(input,&tumpukan);
}
for
(i=MAXSTACK;i>0;i--)
{
printf("Isi stack ke- %d : ",i) ;
printf("%d \n",Pop(&tumpukan));
}
}
Berikut Output Program nya:
Percobaan 2
: Program Merubah Notasi Infix menjadi Postfix
Berikut Contoh Source Code nya:
#include <stdio.h>
#include <string.h>
#define MAXSTACK 100
typedef char ItemType;
typedef struct
{
char
item[MAXSTACK]; /* Array yg berisi data tumpukan */
int count; /*
menunjukkan indeks data paling atas dari stack*/
}
Stack;
Stack tumpukan ;
void InitializeStack(Stack *);
int Empty(Stack *);
int Full(Stack *);
void Push(ItemType, Stack *);
ItemType Pop(Stack *);
int drjt(char);
void konversi_cetak(char []);
main()
{
char
tampung[MAXSTACK], jawab;
puts("Mengubah Notasi Infix Menjadi
Psotfix");
puts("Dengan Memanfaatkan Struktur
Stack");
do
{
InitializeStack(&tumpukan);
fflush(stdin);
puts("");
printf("Masukan ekspresi dalam notasi infix : ");
fgets(tampung,
sizeof(tampung), stdin);
printf("Ungkapan postfixnya = ");
konversi_cetak(tampung);
puts("");
fflush(stdin);
printf("\nMau
mencoba lagi (y/t) ? ");
scanf("%c", &jawab);
}
while((jawab ==
'y') || (jawab == 'Y'));
}
void InitializeStack(Stack *S)
{
S->count =
0;
}
int Empty(Stack *S)
{
return
(S->count == 0);
}
int Full(Stack *S)
{
return
(S->count == MAXSTACK);
}
void Push(ItemType x, Stack *S)
{
if (Full(S))
//stack penuh
printf("Stack penuh! Data tidak dapat
masuk!");
else
{
++(S->count);
S->item[S->count]=x;
}
}
ItemType Pop(Stack *S)
{
ItemType x;
if (Empty(S))
{ //stack
kosong
printf("STACK KOSONG!");
return 0;
}
else
{
x =
(S->item[S->count]);
--(S->count);
return x;
}
}
int drjt(char x) //menentukan derajat operator
{
if(x == '(')
return 0;
else if((x ==
'+') || (x == '-'))
return 1;
else if((x ==
'*') || (x == '/'))
return 2;
else if(x ==
'^')
return 3;
else
return -1;
//invalid operator
}
void konversi_cetak(char temp[])
{
int i, pjg,
valid = 1;
char kar, smtr;
pjg =
strlen(temp)-1;
for
(i=0;i<pjg;i++)
{
kar = temp[i];
//membaca input per karakter
switch(kar)
{
//if kar =
'(' -> push ke dalam tumpukan
case '(' :
Push(kar,
&tumpukan);
break;
//if kar =
operand -> langsung ditulis
case '0':
case '1': case '2': case '3': case '4': case
'5' : case
'6': case '7': case '8': case'9':
printf("%c", kar);
break;
/* if kar =
operator -> jika tumpukan kosong atau derajad
kar lbh tinggi
dibandingderajad ujung tumpukan, push
operator ke
dalam tumpukan. Jika tidak, pop ujung
tumpukan dan
tulis;
Ulangi
pembandingan kar dengan ujung tumpukan.
Kemudian kar
di-push*/
case '+':
case '-': case'*': case '/': case '^' :
if((Empty(&tumpukan))
|| ((drjt(kar) > drjt(tumpukan.item[tumpukan.count]))))Push(kar,
&tumpukan);
else
{
do
{
smtr =
Pop(&tumpukan);
printf("%c", smtr);
}
while
(drjt(kar) <drjt(tumpukan.item[tumpukan.count]));
Push(kar,
&tumpukan);
}
break;
while(tumpukan.item[tumpukan.count] != '(')
{
smtr =
Pop(&tumpukan);
printf("%c", smtr);
}
Pop(&tumpukan);
break;
default :
//selain dari kar yang diijinkan
valid = 0;
puts("INVALID STSTEMEN");
break;
} //end of
switch-case
} //end of
looping for
if((valid !=
0) && (!Empty(&tumpukan)))
{
smtr =
Pop(&tumpukan);
printf("%c", smtr);
}
}
Berikut Output Program nya:
B. Contoh Soal Program
Menggunakan Stack Dalam C++
1. Lakukan operasi berikut : • Jika karakter maka push
ke stack • Jika asterisk (*) maka pop dan cetak hasilnya. Bagaimana output program
dengan input seperti di bawah ini ? E A S * Y * Q U E * * * S T * * * I O * N *
* *
Berikut program nya:
#include <stdio.h>
#define MAKS 40
int p = 0;
typedef char tipe;
typedef struct
{
char
item[MAKS];
int count;
} Stack;
void insialisasi(Stack *S)
{
S->count =
0;
}
int penuh(Stack *S)
{
return
(S->count == MAKS);
}
int kosong(Stack *S)
{
return
(S->count == 0);
}
void push(tipe x, Stack *S)
{
if (penuh(S))
printf("Stack tidak dapat ditambah karna
sudah penuh\n");
else
{
S->item[S->count] = x;
printf("Stack berada di diindex ke %d\n", x, S->count);
++(S->count);
}
}
int pop(Stack *S, char cetak[MAKS])
{
if (kosong(S))
printf("maaf stack masih kosong\n");
else
{
--(S->count);
cetak[p] =
S->item[S->count];
printf("%c Telah Dikeluarkan dari stack \n",
S->item[S->count]);
}
return p;
}
void isi(Stack *S)
{
int a = 0;
printf("Isi : ");
while (a <
S->count)
printf("%c", S->item[a++]);
printf("\n");
}
int main()
{
char cetak[MAKS];
int a, b;
int c;
char input;
Stack tumpukan;
insialisasi(&tumpukan);
printf("Masukkan input, jika char maka
akan masuk ke dalam stack lalu cetak hasilnya\n");
for (a = 0; a
!= MAKS; a++)
{
printf("Huruf : ");
scanf("%c", &input);
fflush(stdin);
if (input ==
'*' || input == '/' || input == '-' || input == '+')
{
c =
pop(&tumpukan, cetak);
isi(&tumpukan);
b = 0;
printf("Silahkan Mengisi stack : \n");
while (b <
p)
printf("
%d\n", cetak[b++]);
}
else if (input
== '^')
{
break;
}
else
push(input,
&tumpukan);
}
for (a = 0; a
< c; a++)
{
printf("%c ", cetak[a]);
}
}
Berikut Output Program nya:
2. Buatlah sebuah program yang melakukan konversi dari
bilangan desimal ke bilangan biner, octal, heksa dengan menggunakan stack
Berikut program nya:
#include <stdio.h>
#define MAXSTACK 40
typedef int ItemType;
typedef struct
{
int
Item[MAXSTACK];
int Count;
}
Stack;
void InisialisasiStack(Stack *S)
{
S->Count =
0;
}
int Kosong(Stack *S)
{
return
(S->Count == 0);
}
int Penuh(Stack *S)
{
return
(S->Count == MAXSTACK);
}
void Push(ItemType x, Stack *S)
{
if (Penuh(S))
printf("Stack penuh! Data tidak dapat
masuk!\n");
else
{
S->Item[S->Count] = x;
++(S->Count);
}
}
char Pop(Stack *S)
{
if (Kosong(S))
printf("Stack masih kosong!\n");
else
{
--(S->Count);
return
(S->Item[S->Count]);
}
}
int main()
{
int i, n,
hitung, input, temp;
Stack tumpukan;
InisialisasiStack(&tumpukan);
printf("Masukkan angka desimal, yang akan
dikonversikan ke biner, oktal, dan heksadesimal\n");
printf("User Input : ");
scanf("%d", &input);
fflush(stdin);
n = input;
for (i = 0; n
> 0; i++)
{
hitung = i +
1;
temp = n % 2;
Push(temp,
&tumpukan);
n = n / 2;
}
printf("\nBiner: ");
for (i = 0; i
< hitung; i++)
printf("%d", Pop(&tumpukan));
n = input;
for (i = 0; n
> 0; i++)
{
hitung = i +
1;
temp = n % 8;
Push(temp,
&tumpukan);
n = n / 8;
}
printf("\nOktal: ");
for (i = 0; i
< hitung; i++)
printf("%d", Pop(&tumpukan));
n = input;
for (i = 0; n
> 0; i++)
{
hitung = i +
1;
temp = n % 16;
Push(temp,
&tumpukan);
n = n / 16;
}
printf("\nHeksadesimal: ");
for (i = 0; i
< hitung; i++)
{
temp =
Pop(&tumpukan);
if (temp <=
9)
printf("%d", temp);
else
printf("%c", temp + 55);
}
}
Berikut Output Program nya:
3. Buatlah sebuah program yang melakukan pembalikan
terhadap kalimat dengan menggunakan stack Contoh: Kalimat : Struktur Data Hasil setelah dibalik : ataD rutkurtS
Berikut program nya:
#include <stdio.h>
#include <conio.h>
#include <string.h>
char balik(char x[50]);
char cek(char y[50], char z[50]);
int main()
{
char m[50],
o[50];
printf("Silahkan Input Kalimat Yang Mau
Dibalik\n");
printf("User Input : ");
gets(m);
strcpy(o, m);
balik(o);
getch();
}
char balik(char x[50])
{
strrev(x);
printf("Hasil Pembalikan : %s", x);
}
Berikut Output Program nya:
4. Tentukan apakah sebuah kalimat yang diinputkan
dalam program (dengan menggunakan stack) adalah sebuah palindrom atau bukan.
Palindrom adalah kalimat yang jika dibaca dari depan dan dari belakang, maka
bunyinya sama. Contoh: Kalimat : sugus Kalimat tersebut adalah palindrom
Berikut program nya:
#include <stdio.h>
#include <conio.h>
#include <string.h>
char balik(char x[50]);
char cek(char y[50], char z[50]);
int main()
{
char m[50],
o[50];
printf("Silahkan Masukan Kalimat Yang Mau
Dicek\n");
printf("User Input : ");
gets(m);
strcpy(o, m);
balik(o);
cek(m, o);
getch();
printf("Silahkan
Masukan lagi Kalimat Yang Mau Dicek\n");
printf("User Input : ");
gets(m);
strcpy(o, m);
balik(o);
cek(m, o);
getch();
}
char balik(char x[50])
{
strrev(x);
}
char cek(char y[50], char z[50])
{
if (strcmp(y,
z) == 0)
{
printf("\nKalimat tersebut adalah
palindrom\n\n");
}
else
{
printf("\nKalimat tersebut bukan
palindrom\n\n");
}
}
Berikut Output Program nya:
5. Tambahkan implementasi Percobaan2 untuk mengecek
apakah notasi infix yang diinputkan benar atau tidak. Contoh : Infix : 5 * ( 4
– 2 Output : Notasi infix salah, kurung tidak lengkap Infix : 5 * ( 4 – )
Output : Notasi infix salah, operand tidak lengkap Infix : 5 ( 4 – 2 ) Output :
Notasi infix salah, operator tidak lengkap
Berikut Program nya:
#include <stdio.h>
#include <string.h>
#define MAXSTACK 40
typedef int ItemType;
typedef struct
{
ItemType
item[MAXSTACK];
int count;
}
Stack;
void InisialisasiStack(Stack *s)
{
s->count =
0;
}
int Kosong(Stack *s)
{
return
s->count == 0;
}
int Penuh(Stack *s)
{
return
s->count == MAXSTACK;
}
void Push(Stack *s, ItemType x)
{
if (Penuh(s))
printf("Stack penuh! Data tidak dapat
masuk!\n");
else
{
s->item[s->count] = x;
s->count++;
}
}
ItemType Pop(Stack *s)
{
ItemType temp =
-1;
if (Kosong(s))
printf("Stack masih kosong!\n");
else
{
s->count--;
temp =
s->item[s->count];
}
return temp;
}
int level(char oper)
{
if (oper ==
'^')
return 4;
else if (oper
== '*' || oper == '/')
return 3;
else if (oper
== '+' || oper == '-')
return 2;
else if (oper
== '(')
return 1;
else
return 0;
}
int main()
{
Stack t;
char
infix[MAXSTACK], temp;
int i, j;
InisialisasiStack(&t);
printf("Input Notasi Infix Yang Mau
Dicek: \n");
printf("User Input : ");
scanf("%s", &infix);
for (i = 0; i
< strlen(infix); i++)
{
if ((infix[i]
>= 'A' && infix[i] <= 'Z') || (infix[i] >= '0' &&
infix[i] <= '9'))
printf("%c", infix[i]);
else if
(infix[i] == '(')
{
Push(&t,
infix[i]);
if (i != 0
&& !(infix[i-1] == '^' || infix[i-1] == '*' || infix[i-1] == '/' ||
infix[i-1] == '+' || infix[i-1] == '-'))
printf("\nNotasi infix salah, operator tidak lengkap\n");
char kurung =
't';
for (j = i;
infix[j] != '\0'; j++)
{
if (infix[j]
== ')')
{
kurung =
'y';
break;
}
}
if (kurung ==
't')
printf("\nNotasi infix salah, kurung tidak lengkap\n");
}
else if
(infix[i] == ')')
{
if
(!(infix[i-1] >= '0' && infix[i] <= '9'))
printf("\nNotasi
infix salah, operand tidak lengkap\n");
while
(t.item[t.count - 1] != '(')
printf("%c", Pop(&t));
temp =
Pop(&t);
}
else if
(infix[i] == '^' || infix[i] == '*' || infix[i] == '/' || infix[i] == '+' ||
infix[i]== '-')
{
if (Kosong(&t)
|| level(t.item[t.count - 1] < level(infix[i])))
Push(&t,
infix[i]);
else
{
while
(level(t.item[t.count - 1]) >= level(infix[i]))
{
printf("%c", Pop(&t));
}
Push(&t,
infix[i]);
}
}
else if
(infix[i] == ' ')
continue;
else
printf("Notasi salah\n");
}
while (!Kosong(&t))
printf("%c", Pop(&t));
return 0;
}
Berikut Output Program nya:
6. Tambahkan implementasi Percobaan2 hingga
mendapatkan hasil penghitungannya. Contoh: infix : 5 * ( 4 – 2 ) postfix : 542-*
hasil : 10
Berikut Program nya:
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAXSTACK 40
typedef int ItemType;
typedef struct
{
ItemType
item[MAXSTACK];
int count;
}
Stack;
void InisialisasiStack(Stack *s)
{
s->count =
0;
}
int Kosong(Stack *s)
{
return
s->count == 0;
}
int Penuh(Stack *s)
{
return
s->count == MAXSTACK;
}
void Push(Stack *s, ItemType x)
{
if (Penuh(s))
printf("Stack penuh! Data tidak dapat
masuk! \n");
else
{
s->item[s->count] = x;
s->count++;
}
}
ItemType Pop(Stack *s)
{
ItemType temp =
-1;
if (Kosong(s))
printf("Stack masih kosong! \n");
else
{
s->count--;
temp =
s->item[s->count];
}
return temp;
}
int level(char oper)
{
if (oper ==
'^')
return 4;
else if (oper
== '*' || oper == '/')
return 3;
else if (oper
== '+' || oper == '-')
return 2;
else if (oper
== '(')
return 1;
else
return 0;
}
int main()
{
Stack t, r;
char
infix[MAXSTACK], temp, postfix[MAXSTACK];
int i, j = 0,
OpLeft, OpRight, hasil;
InisialisasiStack(&t);
InisialisasiStack(&r);
printf("Input Notasi Infix Yang Mau
Dicek: \n");
printf("User Input : ");
scanf("%s", &infix);
for (i = 0; i
< strlen(infix); i++)
{
if ((infix[i]
>= 'A' && infix[i] <= 'Z') || (infix[i] >= '0' &&
infix[i] <= '9'))
{
postfix[j++]
= infix[i];
printf("%c", postfix[j]);
}
else if
(infix[i] == '(')
{
Push(&t,
infix[i]);
}
else if
(infix[i] == ')')
{
while (t.item[t.count
- 1] != '(')
{
postfix[j++]
= Pop(&t);
printf("%c", postfix[j]);
}
temp =
Pop(&t);
}
else if
(infix[i] == '^' || infix[i] == '*' || infix[i] == '/' || infix[i] == '+' ||
infix[i]== '-')
{
if
(Kosong(&t) || level(t.item[t.count - 1] < level(infix[i])))
Push(&t,
infix[i]);
else
{
while
(level(t.item[t.count - 1]) >= level(infix[i]))
{
postfix[j++]
= Pop(&t);
printf("%c", postfix[j]);
}
Push(&t,
infix[i]);
}
}
else if
(infix[i] == ' ')
continue;
else
printf("Notasi salah\n");
}
while (!Kosong(&t))
{
postfix[j++] =
Pop(&t);
printf("%c", postfix[j]);
}
postfix[j] = '\0';
for (i = 0; i < strlen(postfix); i++)
{
if (postfix[i]
>= '0' && postfix[i] <= '9')
Push(&r,
postfix[i] - 48);
else if
(postfix[i] == '^' || postfix[i] == '*' || postfix[i] == '/' || postfix[i] ==
'+' ||
postfix[i] ==
'-')
{
OpRight =
Pop(&r);
OpLeft =
Pop(&r);
if (postfix[i]
== '^')
hasil =
(int)pow(OpLeft, OpRight);
else if (postfix[i]
== '*')
hasil = OpLeft
* OpRight;
else if
(postfix[i] == '/')
hasil =
(int)OpLeft / OpRight;
else if
(postfix[i] == '+')
hasil = OpLeft
+ OpRight;
else
hasil = OpLeft
- OpRight;
Push(&r,
hasil);
}
else
printf("Notasi tidak dikenal\n");
}
while (!Kosong(&r))
printf("\nInfix = %s\nPostfix = %s\nHasil =
%d", infix, postfix, Pop(&r));
return 0;
}
Berikut Output Program nya:
0 comments:
Posting Komentar