Praktikum Stack
Praktikum Stack
Soal
B. Jawaban
1.
#include <stdio.h>
#define MAXSTACK 40
int k;
typedef char ItemType;
typedef struct
{
char Item[MAXSTACK];
int Count;
} Stack;
else
{
S->Item[S->Count] = x;
printf("%c telah masuk ke dalam stack pada indeks ke-%d\n", x,
S->Count);
++(S->Count);
}
}
else
{
--(S->Count);
cetak[k] = S->Item[S->Count];
printf("%c telah keluar dari stack\n", S->Item[S->Count]);
k++;
}
return k;
}
printf("\n");
}
int main()
{
char cetak[MAXSTACK];
int i, j;
int n;
char input;
Stack tumpukan;
InisialisasiStack(&tumpukan);
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:
2.
#include <stdio.h>
#define MAXSTACK 40
typedef int ItemType;
typedef struct
{
int Item[MAXSTACK];
int Count;
} Stack;
else
{
S->Item[S->Count] = x;
++(S->Count);
}
}
else
{
--(S->Count);
return (S->Item[S->Count]);
}
}
void main()
{
int i, n, hitung, input, temp;
Stack tumpukan;
InisialisasiStack(&tumpukan);
printf(">> ");
scanf("%d", &input);
fflush(stdin);
// pembatassssssssssssssssssssssss
n = input;
// pembatassssssssssssssssssssssss
n = input;
// pembatassssssssssssssssssssssss
n = input;
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++;
}
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 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]);
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 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';
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.