Anda di halaman 1dari 51

LAPORAN PRAKTIKUM

STRUKTUR DATA
Modul Praktikum 2

Disusun oleh:

Nama : Desi Maya Sari

Nim : 2107110665

Dosen : T. Yudi Hadiwandra, S.Kom, M.Kom

Asisten : 1. Mamba Ul Izzi (1807124814)


2. Rifqi Al Hanif Simbolon (1807195430)

PROGRAM STUDI TEKNIK INFORMATIKA


FAKULTAS TEKNIK
UNIVERSITAS RIAU
GENAP 2021/2022
A. TUGAS PENDAHULUAN
1. Operasi menciptakan T sebagai stack kosong

Start

S - >count =
0

End

1
2. Fungsi yang melakukan pengecekan apakah stack dalam kondisi kosong

Start

Int Empty (stack *S)

Return(S - > count = 0

End

2
3. Fungsi yang mengecek apakah stack dalam kondisi penuh

Start

int full (stack *s)

Return (s - > count = =


MAXSTACK);

End

3
4. Operasi menyisipkan elemen X ke stack T dan mengembalikan stack baru

Start

Item type x, stack *s;

False
S->count = -

True

Printf (“stack penuh! s-> item [s ->count 1 =


data tidak masuk!”); x; == (s->count);

End

4
5. Operasi pengembalian elemen puncak stack T, (pop ( T, x))

Start

Int pop (stack *s


itemType *x)

False
S->count ==0

True

Printf (“stack S-> count *x = S ->


kosong”); utem [S-> count];

End

5
2. Buatlah flowchart untuk latihan soal nomor 1 dan 2
Flowchart latihan 1 : Main

Start

My stack *st ;
char input [Max];
int i ; st top =-1;;

Masukan kalimat;

No
While input !=
„10‟

Yes

(push std, input Isalpha


[i]); (input[i])

Yes No

Yes
input[i])
pop (*st)
„*‟;

No

i++ printf (“ “)

End

6
Flowchart push latihan 1

Start

My – stack *s ;
char c;

s-> top ++;


s->kata [s -> top] =
c;

End

7
Flowchart pop latihan 1

Start

My – stack *s

kosong

Printf (“%c” s-
My – stack *s
>kata [stop-];

End

8
Flowchart kosong latihan 1

Start

My – stack *s ;

Return (s-> top <


0?i:0

End

9
Flowchart latihan 2 : Main

Start

Input bilangan
dalam desimal

No
Yes

Konversi kedalam
binner, oktal, heksa

Print ke dalam
binner,oktal, heksa

End

10
Bilangan Biner

Start

0=1; n; input;
I= MAXSTACK n=n/i

No
n>0?

Yes

MAXSTACK=0;
M=n % 2 = push
(m, & tumpukan : 1<0
0++; ?

yes

Printf (pop
End (&tumpukan))

i--;

11
Bilangan Oktal

Start

0=1; n; input;
I= MAXSTACK n=n/i

No
n>0?

Yes

MAXSTACK=0;
M=n % 8 = push
(m, & tumpukan : 1<0
0++; ?

yes

Printf (pop
End (&tumpukan))

i--;

12
Bilanga Heksadesimal

Start

0=1; n; input;
I= MAXSTACK n=n/i

No
n>0?

Yes

MAXSTACK=0;
M=n % 16 = push
(m, & tumpukan : 1<0
0++; ?

yes

Printf (pop
End (&tumpukan))

i--;

13
B. PERCOBAAN
Percobaan 1 : Penerapan fungsi-fungsi tumpukan, memasukan isi tumpukan
dan menampilkan isi tumpukan.

#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(ItemType x, Stack *S)
{
if (S->Count==0)//stack kosong
printf ("Stack masih kosong!");
else
{
--(S->Count);
return S->Item[S->Count] = x;
}

14
}
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));
}
}

15
Percobaan 2 : Program merubah notasi menjadi postfix

/* Implementasi algoritma utk mengubah infix menjadi postfix


*/
#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;
}

16
{
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
}

17
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': casem'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;
/* if kar = ')' -> pop dan tulis semua isi tumpukan sampai
ujung tumpukan = '('.
Pop juga tanda '(' ini, tetapi tidak usah ditulis*/
case ')' :
while(tumpukan.item[tumpukan.count] != '(') {
smtr = Pop(&tumpukan);
printf("%c", smtr);
}

18
Pop(&tumpukan);
break;
default : //selain dari kar yang diijinkan
valid = 0;
puts("INVALID STSTEMEN");
break;
} //end of switch-case
} //end of looping for
/*Jika statemen valid, akhir notasi infix telah tercapai,
sedangkan tumpukan masih belum kosong, pop semua isi
tumpukan dan tulis hasilnya*/
if((valid != 0) && (!Empty(&tumpukan)))
{
smtr = Pop(&tumpukan);
printf("%c", smtr);
}
}

19
C. PRAKTIKUM
1.TUJUAN PRAKTIKUM
1. Memahami dan mengerti konsep pada stack
2. Memahami dan mengerti operasi-operasi yang ada dalam stack
3. Dapat menggunakan stack untuk memecahkan permasalahan
pemrograman

20
2. DASAR TEORI
Stack adalah sebuah kumpulan data dimana data yang diletakkan di
atas data yang lain. Dengan demikian stack adalah struktur data yang
menggunakan konsep LIFO. Dengan demikian, elemen terakhir yang
disimpan dalam stack menjadi elemen pertama yang diambil. Dalam
proses komputasi, untuk meletakkan sebuah elemen pada bagian atas dari
stack, maka kita melakukan push dan untuk memindahkan dari tempat
yang atas tersebut, kita melakukan pop.
Pada stack ada operasi-operasi dasar yaitu :
1. Operasi menciptakan T sebagai stack kosong
Void InitializeSatack(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 elemen x ke stack T dan mengembalikan stack


baru
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);
}
}
5. Operasi mengambil elemen puncak stack T, (pop(T,x))

21
int Pop(Stack *S, ItemType *x)
{
if (S->Count==0)//stack kosong
else
{
printf("Stack masih kosong!");
--(S->Count);
*x = S->Item[S->Count];
}
}

22
3. PEMBAHASAN
C++ adalah bahasa pemrograman yang biasanya digunakan untuk
mengembangkan aplikasi sistem di komputer, termasuk dalam general
purposes language, maka tergantung dari pemahaman tentang bahasa ini,
hampir semua aplikasi bisa dikembangkan dengannya. Dev C++
digunakan sebagai IDE, aplikasi yang memudahkan kita dalam rangka
membuat program dalam bahasa C++. Pada aplikasi ini, selain digunakan
untuk menuliskan program, terdapat tool lainnya yang cukup lengkap:
untuk melakukan compile, debugging program yang kita kembangkan,
autocomplete fungsi dan fungsi standar lainnya untuk sebuah alat
pemrograman.

char word[100]=
int maxStack, i;

Char word adalah kata-kata yang berisi char dan kata-kata dengan char di
dalamnya. Halaman ini menampilan kembali setaip kata yang
mengandung kata atau huruf yang telah di inputkan.

Menambahkan data ke stack


Proses penambahan data ke dalam stack disebut operasi Push.
Langkah - langkah operasi push diantaranya :
1. Memeriksa apakah tumpukan (stack) penuh
2. Jika tumpukan penuh, maka sudah tidak ada ruang untuk memasukkan
data ke tumpukan, jadi cukup tampilkan pesan bahwa tumpukan sudah
penuh.
3. Jika masih ada ruang, tambahkan satu nilai pada atas (top) tumpukan
untuk menunjukkan ke ruang kosong selanjutnya
4. Menambahkan data dimana ruang kosong yang telah ditunjuk oleh
top.

Untuk mengimplementasikan program stack di C++ kita membutukan


tiga method atau fungsi push (); untuk menambah data ketumpukan, pop
(); untuk mengeluarkan data dari tumpukan prin stack (); untuk
menampilkan data yang ada ditumpukan. Selain tiga fungsi tersebut, kita
akan membuat dua fungsi opsional untuk mengecek apakah tumpukan
kosong is Empty (); dan tumpukan penuh isFull ();

Algoritma Merubah Notasi Infix Menjadi Notasi Postfix


1. Baca ungkapan dalam notasi infix, misalnya S, tentukan panjang
ungkapan tersebut, misalnya N karakter, siapkan sebuah stack kosong

23
dan siapkan derajad masing-masing operator, misalnya: ^ berderajad 3, *
dan / berderajad 2, + dan – berderajad 1 dan ( berderajad 0.
2. Dimulai dari i = 1 sampai N kerjakan langkah-langkah sebagai berikut:
a. R = S[I]
b. Test nilai R. Jika R adalah:
operand : langsung ditulis
kurung buka : push ke dalam tumpukan
kurung tutup : pop dan tulis semua isi tumpukan sampai ujung
tumpukan = „(„. Pop juga tanda „(„ ini, tetapi tidak
usah ditulis
operator : jika tumpukan kosong atau derajad R lebih tinggi
dibanding derajad ujung tumpukan, push operator
ke dalam tumpukan. Jika tidak, pop ujung tumpukan
dan tulis; kemudian ulang pembandingan R dengan
ujung tumpukan. Kemudian R di-push

c. Jika akhir notasi infix telah tercapai, dan tumpukan masih belum
kosong, pop semua isi tumpukan dan tulis hasilnya.

Untuk memahami algoritma di atas, kita coba mengubah ungkapan


berikut, yang ditulis menggunakan notasi infix, menjadi notasi postfix
( A + B ) / (( C – D ) * E ^ F)
Ilustrasi pengubahan notasi infix di atas menjadi notasi postfix secara
lengkap tersaji dalam tabel sebagai berikut:
Karakter Hasil Notasi postfix
Karakter dibaca Isi Tumpukan
Tercetak yang terbentuk
( (
A (+ A A
+ (+
B B AB
) + AB+
/ /
( /(
( /((
C /(( C AB + C
- /((-
D /((- D AB+CD
) /( - AB+CD-
* /(*
E /(* E AB+CD-E
^ /(*^

24
Karakter Hasil Notasi postfix
Karakter dibaca Isi Tumpukan
Tercetak yang terbentuk
F /(*^ F AB+CD-EF
) /( ^ AB+CD-EF^
/ * AB+CD-EF^*

/ AB+CD-EF^*

Dari ilustrasi diatas, bila kita lihat bahwa notasi postfix dari lingkupan:
( A + B ) / (( C – D ) * E ^ F)
adalah
A B + C D – E F ^ */

25
4. HASIL
Latihan 1 : Bagaimana output program dengan input seperti di bawah ini
EAS*Y*QUE***ST***IO*N***

Penjelasan :
Program ini menggunakan stack untuk menampilkan output dari
ketentuan soal yang tertera.

26
Latihan 2 : Buatlah sebuah program yang melakukan konversi dari
bilangan desimal ke bilangan biner, oktal, heksa dengan menggunakan
stack

Penjelasan :
program ini bertujuan, untuk melakukan konversi bilangan desimal ke
bilangan biner, bilangan oktal, bilangan heksadesimal dengan cara
menginput bilangan desimal, lalu pilih konversi ke bilangan yang
diinginkan.

27
Latihan 3 : Buatlah sebuah program yang melakukan pembalikan terhadap
kalimat dengan menggunakan stack

Penjelasan :
Program ini berfungsi untuk membalikan sebuah kalimat dapat
menggunakan stack, selanjutnya input kalimat yang anda ingin balikan.

28
Latihan 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.

Penjelasan :
Program ini berfungsi untuk mendeteksi sebuah kalimat yang di input
merupakan sebuah polindrome atau tidak polindrome dengan
menggunakan stack.

29
Latihan 5 : Tambahkan implementasi Percobaan 2 untuk mengecek apakah
notasi infix yangdi input kan benar atau tidak.

Penjelasan :
Program ini berfungsi untuk mengecek notasi yang diinput oleh user,
ketika notasi yang di-input terdapat kekurangan kurung operand dan
operator maka output akan menampilkan pesan.

30
Latihan 6 : Tambahkan implementasi Percobaan 2 hingga mendapatkan
hasil penghitungannya.

Penjelasan :
Program ini berfungsi untuk menampilkan hasil perhitungan nilai infix
yang di input oleh user.

31
5. KESIMPULAN
Stack adalah tipe data abstrak yang umum digunakan pada seluruh
pemrograman komputer. Stack sendiri sama seperti halnya tumpukan jika
di dunia nyata, misalnya tumpukan piring yang telah selesai dicuci, akan
ditumpuk dari bawah ke atas, kemudian setelah semua bersih maka
diambil satu persatu dari atas ke bawah di masukkan ke lemari atau rak
piring. Untuk mengimplementasikan program stack di C++ kita
membutuhkan tiga method atau fungsi push(); untuk menambahkan data
ke tumpukan, pop (); untuk me ngeluarkan data dari tumpukan dan
printStack() untuk menampilkan data yang ada di tumpukan.

32
6. LISTING PROGRAM
Latihan 1 : Bagaimana output program dengan input seperti di bawah ini
EAS*Y*QUE***ST***IO*N***

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct
{
char kata[35];
int top;
}My_Stack;

void push(My_Stack*, char);


void pop(My_Stack*);
int kosong(My_Stack*);

int main()
{
My_Stack st;
char input[50];
int i = 0;
st.top = -1;
printf("Masukkan Kalimat : ");
gets(input);
printf("Hasil : ");

while(input[i] != '\0')
{
if(isalpha(input[i]))
push(&st, input[i]);
else if(input[i] == '*')
pop(& st);
else
{
printf("");
}
i++;
}
}
void push(My_Stack* s, char c)
{
s->top++;
s->kata[s->top] = c;
}

33
void pop(My_Stack* s)
{
if(kosong(s))
{
printf("ERROR!");
}
printf("%c", s->kata[s->top--]);
}

int kosong(My_Stack* s)
{
return(s->top < 0? 1:0);
}

34
Latihan : Buatlah sebuah program yang melakukan konversi dari bilangan
desimal ke bilangan biner, oktal, heksa dengan menggunakan stack

#include <stdio.h>
#include <string.h>

int MAXSTACK;
typedef int itemtype;

typedef struct
{
itemtype item[300];
int count;
}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(full(s))
printf("stack penuh !\n");
else
{
s->item[s->count]=x;
++(s->count);
}
}

int pop(stack *s)


{
if(empty(s))
printf("stack kosong\n");
else
{
--(s->count);
return (s->item[s->count]);

35
}
return 0;
}
//deklarasi
int i, n, m, o,p,pilih;
int input;
stack tumpukan;
void biner();
void oktal();
void heksa();
main()
{
printf("-------konversi desimal ke biner oktal dan
heksadesimal------\n");
initializestack(&tumpukan);
printf("\nmasukkan bilangan desimal = ");
scanf("%d", &input);
printf("\n---MENU---\n");
printf("1 untuk konversi ke biner\n");
printf("2 untuk konversi ke oktal\n");
printf("3 untuk konversi ke heksa\n");
printf("4 untuk keluar");
while(pilih<4)
{
printf("\n\npilih : ");
scanf("%d",&pilih);
switch(pilih)
{
case 1:
printf("bilangan binernya\n");
biner();break;
case 2:
printf("bilangan oktalnya\n");
oktal();break;
case 3:
printf("bilangan heksadesimalnya\n");
heksa();break;
case 4:
printf("--silahkan tekan enter sekalilagi");
}
}
return 0;
}
//ke oktal
void oktal(){
for(o=1,n=input;n>0;n=n/8,o++

36
{
MAXSTACK=o;
m=n%8;
push(m,&tumpukan);
}
for(i=MAXSTACK;i>0;i--)
{
printf("%d", pop(&tumpukan));
}
}
//ke biner
void biner(){
for(o=1,n=input;n>0;n=n/2,o++)
{
MAXSTACK=o;
m=n%2;
push(m,&tumpukan);
}
for(i=MAXSTACK;i>0;i--)
{
printf("%d", pop(&tumpukan));
}
}
//ke heksa desimal
void heksa(){
for(o=1,n=input;n>0;n=n/16,o++)
{
MAXSTACK=o;
m=n%16;
push(m,&tumpukan);
}
for(i=MAXSTACK;i>0;i--)
{
p=pop(&tumpukan);
if(p<=9)
printf("%d",p);
else if(p==10)printf("A");
else if(p==11)printf("B");
else if(p==12)printf("C");
else if(p==13)printf("D");
else if(p==14)printf("E");
else if(p==15)printf("F");
}
}

37
Latihan 3 : Buatlah sebuah program yang melakukan pembalikan terhadap
kalimat dengan menggunakan stack

#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
using namespace std;

struct Tumpukan
{
char isi[25];
int atas;
}T;

void push (char x){


if(T.atas==25){

cout<<"Tumpukan sudah penuh";


getch();
}else{

T.atas=T.atas+1;
T.isi[T.atas]=x;
}
}
char pop(){
char hasil;
if(T.atas == 0){
cout<<"Tumpukan sudah kosong";
hasil = ' ';
}
else{
hasil = T.isi[T.atas];
T.atas = T.atas - 1;
}
return hasil;
}
int main()
{
int i;
char kalimat[25];
system("CLS");
T.atas=0;
cout<<"masukan kalimat :
";cin.getline(kalimat,sizeof(kalimat));

system("CLS");
cout<<"kalimat asli : "<<kalimat;
38
for(i=0; i<strlen(kalimat); i++)
{
push(kalimat[i]);
}
cout<<"\nKalimat Setelah di balik : ";

for(i=0; i<strlen(kalimat); i++)


{
cout<<pop();
}
cout<<endl;

return 0;
}

39
Latihan 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.
#include <iostream>
#include <string>
using namespace std;

class tumpukan{
public:
tumpukan(){
//buat link list kosong
head=NULL;
tail=NULL;
size=0;
}
//menambahkan data pada stack/membuat node baru
void push(char a){
//buat node baru
node* tmp = new node;
//masukkan data ke node
tmp->data = a;
//tentukan node setelahnya
tmp->next = NULL;
//jika LL kosong
if(size==0){
//head dan tail adalah node yg baru dibuat
head = tmp;
tail = tmp;
//node sebelumnya belum ada
tail->prev = NULL;
}
//jika LL tidak kosong
else{
//node setelah tail adalah node baru
tail->next = tmp;
//node sebelum node baru adalah tail
tmp->prev = tail;
//pindahkan tail ke node baru
tail = tmp;
}
//jumlah node bertambah
size++;
}
//mengambil data dan menghapus node yang terakhir
char pop(){

40
//ambil data di tail
data = tail->data;
if(head==tail){
delete head;
}
else{
//akses tail
node* tmp = tail;
//pindah tail
tail = tail->prev;
//hapus link
tail->next = NULL;
tmp->prev = NULL;
//hapus mantan tail (tmp)
delete tmp;
}
size--;
return data;
}
private:
struct node{
char data;
node* next;
node* prev;
};

node* head;
node* tail;
int size;
char data;
};

class antrian{
public:
antrian(){
//buat link list kosong
head=NULL;
tail=NULL;
size=0;
}
//menambahkan data pada stack/membuat node baru
void push(char a){
//buat node baru
node* tmp = new node;
//masukkan data ke node
tmp->data = a;

41
//tentukan node setelahnya
tmp->next = NULL;
//jika LL kosong
if(size==0){
//head dan head adalah node yg baru dibuat
head = tmp;
tail = tmp;
//node selanjutnya belum ada
head->prev = NULL;
}
//jika LL tidak kosong
else{
//node setelah head adalah node baru
tail->next = tmp;
//node sebelum node baru adalah head
tmp->prev = tail;
//pindahkan head ke node baru
tail = tmp;
}
//jumlah node bertambah
size++;
}
//mengambil data dan menghapus node yang pertama
char pop(){
//ambil data di head
data = head->data;
if(head==tail){
delete head;
}
else{
//akses head
node* tmp = head;
//pindah head
head = head->next;
//hapus link
head->prev = NULL;
tmp->next = NULL;
//hapus mantan head (tmp)
delete tmp;
}
size--;
return data;
}
private:
struct node{
char data;

42
node* next;
node* prev;
};
node* head;
node* tail;
int size;
char data;
};
int main() {
//membuat stack
tumpukan s;
//membuat queue
antrian q;
//membuat variabel bool palindrome
bool palindrome = true;
cout<<" -- Pengecekan Palindrom --"<<endl<<endl;
//membuat variabel penampungan kata
string kata;
//meminta user memasukkan kata
char a,b,c;
do{
cout<<"Masukkan kata : ";cin>>kata;cout<<endl;
//loop untuk memasukkan semua isi dari string kata ke
stack dan queue
for(int i=0;i<kata.length();i++){
s.push(kata[i]);
q.push(kata[i]);
}
//loop untuk membandingkan hasil popping dari stack dan
queue
for(int l = 0;l<kata.length();l++){
//jika keluaran popping berbeda
a = q.pop(); b = s.pop();
if(a != b)
{
cout<<a<<" != "<<b<<endl;
palindrome = false;
}
else{
cout<<a<<" == "<<b<<endl;
}
}
//jika semua hasil perbandingan popping stack dan queue
sama
if(palindrome == true){
cout<<"Kata tersebut adalah kata palindrome";

43
}
else{
cout<<"Kata tersebut tidak palindrome";
}
cout<<"\n\nIngin mengecek kata lainnya? (Y/N)";
cin>>c;cout<<endl;
}while(c == 'Y' || c == 'y');
cout<<endl;
system("pause");
return 0;
}

44
Latihan 5 : Tambahkan implementasi Percobaan 2 untuk mengecek apakah
notasi infix yangdi input kan benar atau tidak.

#include <stdio.h>
#include <string.h>
#define MAXSTACK 100

typedef char ItemType;


typedef struct {
char item[MAXSTACK];
int count;
} 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("Cek Notasi Infiks Benar atau Salah");
puts("Dengan Memanfaatkan Struktur Stack");
do {
InitializeStack(&tumpukan);
fflush(stdin);
puts("");
printf("Masukan ekspresi dalam notasi infix : ");
fgets(tampung, sizeof(tampung), stdin);
printf("Cek Output = ");
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)
{

45
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;
}
}
void konversi_cetak(char temp[])
{
int i,h=0, j=0, l=0, m=0, pjg, valid = 1;
char kar;
// smtr;
pjg = strlen(temp)-1;
for (i=0;i<pjg;i++)
{
kar = temp[i];
switch(kar){
case '(' :
h++;
break;
case '0': case '1': case '2': case '3': case '4': case
'5' : case '6': case '7': case '8': case'9':
j++;

46
break;
case '+': case '-': case'*': case '/': case '^' :
l++;
break;

case ')' :
m++;
break;
default :
valid = 0;
puts("INVALID STSTEMEN");
break;
}
}
if(h!=m){
printf("\nNotasi infix salah, kurung tidak lengkap");
}
else if(j==l){
printf("\nNotasi infix salah, operand tidak lengkap");
}
else if(j-2>=l){
printf("\nNotasi infix salah, operator tidak lengkap");
}else{
printf("\nTidak Ada Kesalahan");
}
}

47
Latihan 6 : Tambahkan implementasi Percobaan 2 hingga mendapatkan
hasil penghitungannya.

#include <iostream>
#include <ctype.h>
#include <stack>
using namespace std;
string getPostfix( string str );
double evaluate( string str );
bool hasPrecedence( char a, char b );
int main()
{
cout << " PROGRAM KALKULATOR "
<< endl;
cout << "...................."
<< endl;
string infixString;
string postFixString;
bool valid = false;

cout << "Masukkan Nilai Infix Yang Anda Inginkan : " ;


// get expression as string
getline( cin, infixString );

// konversi ke infix
postFixString = getPostfix( infixString );
cout << "Nilai Postfix :" << postFixString << endl <<
endl;

// output evaluated expression


cout << "Hasil Perhitungan : " << evaluate(
postFixString ) << endl;
return 0;
}
string getPostfix( string str ) // function to convert
infix to postfix
{

// konversi string
string postFixStr;
// stack for operators
stack<char> stack;
for ( int i = 0; i < str.length(); i++ )
{
if ( isdigit( str[i] ) )
postFixStr += str[i];
else if ( str[i] == '(' )
stack.push( str[i] );

48
else if ( str[i] == '+' || str[i] == '-' || str[i] ==
'*' || str[i] == '/' )
{
if ( stack.empty() || stack.top() == '(' )
{
stack.push( str[i] );
}
else if ( hasPrecedence( str[i], stack.top() ) )
{
stack.push( str[i] );
}
else
{
postFixStr += stack.top();
stack.pop();
stack.push( str[i] );
}
}
else if ( str[i] == ')' )
{
while ( stack.top() != '(' )
{
postFixStr += stack.top();
stack.pop();
}
if ( stack.top() == '(' )
stack.pop();
}
}
while ( ! stack.empty() )
{
postFixStr += stack.top();
stack.pop();
}
return postFixStr;
}
double evaluate( string str )
{
int op1, op2;
stack<int> stack;
for ( int i = 0; i < str.length(); i++ )
{
if ( isdigit( str[i] ) )
stack.push( str[i] - 48 );
else if ( str[i] == '+' )
{

49
op1 = stack.top();
stack.pop();
op2 = stack.top();
stack.pop();
stack.push( op1 + op2 );
}
else if ( str[i] == '-' )
{
op1 = stack.top();
stack.pop();
op2 = stack.top();
stack.pop();
stack.push( op1 - op2 );
}
else if ( str[i] == '*' )
{
op1 = stack.top();
stack.pop();
op2 = stack.top();
stack.pop();
stack.push( op1 * op2 );
}
else if ( str[i] == '-' )
{
op1 = stack.top();
stack.pop();
op2 = stack.top();
stack.pop();
stack.push( op1 / op2 );
}
}
return stack.top();
}
bool hasPrecedence( char a, char b )
{
int aWeight, bWeight = 2;
if ( a == '*' || a == '/' )
aWeight = 2;
else
aWeight = 1;
return aWeight >= bWeight;
}

50

Anda mungkin juga menyukai