Anda di halaman 1dari 15

A.

Soal
B. Jawaban

1.
#include <stdio.h>
#define MAXSTACK 40
int k;
typedef char ItemType;
typedef struct
{
char 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;
printf("%c telah masuk ke dalam stack pada indeks ke-%d\n", x,
S->Count);
++(S->Count);
}
}

int Pop(Stack *S, char cetak[MAXSTACK])


{

if (Kosong(S)) //stack kosong


printf("Stack masih kosong!\n");

else
{
--(S->Count);
cetak[k] = S->Item[S->Count];
printf("%c telah keluar dari stack\n", S->Item[S->Count]);
k++;
}
return k;
}

void Traverse(Stack *S)


{
int i = 0;

printf("Isi stack = ");


while (i < S->Count)
printf("%c", S->Item[i++]);

printf("\n");
}

int main()
{
char cetak[MAXSTACK];
int i, j;
int n;
char input;
Stack tumpukan;

InisialisasiStack(&tumpukan);

printf("Masukkan input, jika char maka akan masuk ke dalam stack


dan jika * maka akan pop lalu cetak hasilnya\n");

for (i = 0; i != MAXSTACK; i++)


{
printf(">> ");
scanf("%c", &input);
fflush(stdin);

if (input == '*')
{
n = Pop(&tumpukan,cetak);
Traverse(&tumpukan);

j = 0;
printf("Daftar cetak = ");
while (j < k)
printf("%c", cetak[j++]);
}
else if (input == '^')
{
break;
}
else
Push(input, &tumpukan);
}
for(i=0; i<n; i++)
{
printf("%c ",cetak[i]);
}

Output:

Analisa: disini saya menginisialisasikan 2 stack yaitu “tumpukan” dan “cetak”.


Lalu saya menggunakan loop untuk mengepush semuanya ke tumpukan dan di
lakukan pengecekan, jika usuer memasukan * maka input sebelumnya akan di
pop dan dipush ke cetak. Program akan berhenti jika bertemu dengan “\0”.

2.
#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)) //stack kosong
printf("Stack masih kosong!\n");

else
{
--(S->Count);
return (S->Item[S->Count]);
}
}

void main()
{
int i, n, hitung, input, temp;
Stack tumpukan;

InisialisasiStack(&tumpukan);

printf("Masukkan angka desimal, nanti akan dikonversikan ke biner,


oktal, dan heksadesimal\n");

printf(">> ");
scanf("%d", &input);
fflush(stdin);

// pembatassssssssssssssssssssssss
n = input;

for (i = 0; n > 0; i++)


{
hitung = i + 1;
temp = n % 2;
Push(temp, &tumpukan);
n = n / 2;
}

printf("\nBilangan Biner: ");

for (i = 0; i < hitung; i++)


printf("%d", Pop(&tumpukan));

// pembatassssssssssssssssssssssss

n = input;

for (i = 0; n > 0; i++)


{
hitung = i + 1;
temp = n % 8;
Push(temp, &tumpukan);
n = n / 8;
}

printf("\nBilangan Oktal: ");

for (i = 0; i < hitung; i++)


printf("%d", Pop(&tumpukan));

// pembatassssssssssssssssssssssss

n = input;

for (i = 0; n > 0; i++)


{
hitung = i + 1;
temp = n % 16;
Push(temp, &tumpukan);
n = n / 16;
}

printf("\nBilangan Heksadesimal: ");

for (i = 0; i < hitung; i++)


{
temp = Pop(&tumpukan);
if (temp <= 9)
printf("%d", temp);
else
printf("%c", temp + 55);
}

Output:

Analisa:
pertama saya membuat stack yang berisi bilangan biner,octal, dan
heksadesimal. Pertama saya memberikan looping pada inputan user untuk
melihat selama inputa > 0 inputan akan bertambah, lalu kedua saya berikan
pada masing biner, oktal, dan heksa untuk di pop dan langsung dicetak. Untuk
heksa harus mencocokan dengan table ASCII dan diecetak dalam bentuk char.

3 dan 4.

#include <stdio.h>
#define MAXSTACK 40
typedef char ItemType;
typedef struct
{
char 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]);
}
}
void main()
{
int i, n=0;
int palindrome = 1;
char input[MAXSTACK], temp;
Stack tumpukan;
InisialisasiStack(&tumpukan);
printf("Masukkan kalimat, nanti akan dibalik\n");
gets(input);
fflush(stdin);
for (i = 0; input[i] != '\0'; i++)
{
Push(input[i], &tumpukan);
n++;
}

for (i = 0; i < n; i++)


{
temp = Pop(&tumpukan);
printf("%c", temp);
if (input[i] != temp) palindrome = 0;
}
if (palindrome)
printf("\n\nKalimat di atas adalah palindrome");
else
printf("\n\nKalimat di atas bukanlah palindrome");
}
\

Analisa:
Disini untuk nomer 3 dan 4. Pertama saya membuat stack , lalu memasukan inputan
user kedalam variable input, lalu saya beri perulangan for untuk di push setiap
karakternya. Lalu untuk loop selanjutnya digunakan untuk mempop stak kedalam
temp lalu mencetaknya dan akan membuat teks terbalik. Jika palindrome = 1 maka
akan mencetak bahwa kalimat adalah kalimat palindrome.

5.
#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("Masukkan notasi infix: ");
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;
}
Analisa:
Pertama saya membaut stack. Kedua saya lakukan pengecekan dengan menggunakan
loop for terhadap tanda () jika dalam inputan tidak ditemukan maka akan terisi tengan
karakter ‘t’ jika kurung sama t makan akan keluat output kurung tidak lengkap. Ketiga
untuk operator tidak lengkap saya melakukan pengecekan ketika I tidak sam dengan 0
maka akan tidak ada perator atau operator tidak lengkap.Keempat untuk perand tidak
lengkap, akan di cek jika 1 sebelum ‘)’ maka akan tidak ditemukan adanya angka
maka akan mencetak operand tidak lengkap.

6.
#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("Masukkan notasi infix: ");
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];
}
else if (infix[i] == '(')
{
Push(&t, infix[i]);
}
else if (infix[i] == ')')
{
while (t.item[t.count - 1] != '(')
{
postfix[j++] = 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]))
{
postfix[j++] = Pop(&t);
}
Push(&t, infix[i]);
}
}
else if (infix[i] == ' ')
continue;
else
printf("Notasi salah\n");
}
while (!Kosong(&t))
{
postfix[j++] = Pop(&t);
}

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

Analisa:
Kurang lebih program no.6 ini sama dengan no.5.disini saya menggunakan array untk
postfixnya makan akan menjadi string, jika ditemukan angka pada array potfix maka
akan langsung di push ke stak, danjika ditemukan operator maka stak akan di pop 2x.
lalu hasil operasi ini akan disimpan dalam variable hasil dan akan dipush kedalam
stak lagi.

Kesimpulan
Di praktikum ini kami di ajarkan untuk mempelajari dan memahami cara kerja
struktur dan stack dan juga fungsinya push dan pop.

Anda mungkin juga menyukai