PRAKTIKUM 8: Mengimplementasikan struktur data stack
menyimpan bilangan bulat. Program tersebut harus memiliki fungsi-fungsi berikut:
• push(): Untuk menambahkan elemen ke dalam stack.
• pop(): Untuk menghapus elemen teratas dari stack.
• peek(): Untuk mengambil nilai elemen teratas dari stack tanpa menghapusnya.
• isEmpty(): Untuk memeriksa apakah stack kosong.
• isFull(): Untuk memeriksa apakah stack penuh.
1. Jawaban Soal Stack menggunakan array untuk menyimpan bilangan bulat
▪ Buka Text Editor Code::Blocks,
▪ Pilih menu klik file → New→Empty File
▪ Ketikan koding di bawah ini
#include <stdio.h>
#define MAX_SIZE 100
// Struktur Stack
struct Stack {
int data[MAX_SIZE];
int top;
};
// Fungsi push: Menambahkan elemen ke dalam stack
void push(struct Stack *stack, int element) {
if (stack->top == MAX_SIZE - 1) {
printf("Stack overflow, tidak dapat menambahkan elemen\n");
} else {
stack->top++;
stack->data[stack->top] = element;
printf("Elemen %d ditambahkan ke dalam stack\n", element);
}
}
// Fungsi pop: Menghapus elemen teratas dari stack
void pop(struct Stack *stack) {
if (stack->top == -1) {
printf("Stack underflow, tidak ada elemen yang dapat dihapus\n");
} else {
int element = stack->data[stack->top];
stack->top--;
printf("Elemen %d dihapus dari stack\n", element);
}
}
// Fungsi peek: Mengambil nilai elemen teratas dari stack tanpa menghapusnya
int peek(struct Stack stack) {
if (stack.top == -1) {
printf("Stack kosong\n");
return -1;
} else {
return stack.data[stack.top];
}
}
// Fungsi isEmpty: Memeriksa apakah stack kosong
int isEmpty(struct Stack stack) {
if (stack.top == -1) {
return 1; // True, stack kosong
} else {
return 0; // False, stack tidak kosong
}
}
// Fungsi isFull: Memeriksa apakah stack penuh
int isFull(struct Stack stack) {
if (stack.top == MAX_SIZE - 1) {
return 1; // True, stack penuh
} else {
return 0; // False, stack tidak penuh
}
}
int main() {
struct Stack stack;
stack.top = -1;
push(&stack, 10);
push(&stack, 20);
push(&stack, 30);
printf("Elemen teratas stack: %d\n", peek(stack));
pop(&stack);
printf("Elemen teratas stack setelah pop: %d\n", peek(stack));
printf("Apakah stack kosong? %s\n", isEmpty(stack) ? "Ya" : "Tidak");
printf("Apakah stack penuh? %s\n", isFull(stack) ? "Ya" : "Tidak");
return 0;
}
▪ Klik menu file Save, ketikan nama
▪ Klik Build →Build and Run atau icon
▪ berikut hasilnya
Analisa Program
stack untuk memeriksa keseimbangan tanda kurung dalam string tersebut. Program harus
memberikan output "Keseimbangan Tanda Kurung Benar" jika tanda kurung dalam string
seimbang, dan "Keseimbangan Tanda Kurung Salah" jika tanda kurung tidak seimbang.
2. Jawaban Soal Menerima input string dari pengguna dan menggunakan stack
▪ Buka Text Editor Code::Blocks,
▪ Pilih menu klik file → New→Empty File
▪ Ketikan koding di bawah ini
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
// Struktur Stack
struct Stack {
char data[MAX_SIZE];
int top;
};
// Fungsi push: Menambahkan elemen ke dalam stack
void push(struct Stack *stack, char element) {
if (stack->top == MAX_SIZE - 1) {
printf("Stack overflow, tidak dapat menambahkan elemen\n");
} else {
stack->top++;
stack->data[stack->top] = element;
}
}
// Fungsi pop: Menghapus elemen teratas dari stack
void pop(struct Stack *stack) {
if (stack->top == -1) {
printf("Stack underflow, tidak ada elemen yang dapat dihapus\n");
} else {
stack->top--;
}
}
// Fungsi peek: Mengambil nilai elemen teratas dari stack tanpa menghapusnya
char peek(struct Stack stack) {
if (stack.top == -1) {
return '\0';
} else {
return stack.data[stack.top];
}
}
// Fungsi isEmpty: Memeriksa apakah stack kosong
int isEmpty(struct Stack stack) {
if (stack.top == -1) {
return 1; // True, stack kosong
} else {
return 0; // False, stack tidak kosong
}
}
// Fungsi isBalanced: Memeriksa keseimbangan tanda kurung dalam string
int isBalanced(char string[]) {
struct Stack stack;
stack.top = -1;
int i;
for (i = 0; i < strlen(string); i++) {
if (string[i] == '(' || string[i] == '[' || string[i] == '{') {
push(&stack, string[i]);
} else if (string[i] == ')' || string[i] == ']' || string[i] == '}') {
if (isEmpty(stack)) {
return 0; // Kurung tidak seimbang
} else if ((string[i] == ')' && peek(stack) == '(') ||
(string[i] == ']' && peek(stack) == '[') ||
(string[i] == '}' && peek(stack) == '{')) {
pop(&stack);
} else {
return 0; // Kurung tidak seimbang
}
}
}
if (isEmpty(stack)) {
return 1; // Kurung seimbang
} else {
return 0; // Kurung tidak seimbang
}
}
int main() {
char string[MAX_SIZE];
printf("Masukkan string: ");
fgets(string, sizeof(string), stdin);
// Menghapus karakter newline pada akhir string
if (string[strlen(string) - 1] == '\n') {
string[strlen(string) - 1] = '\0';
}
if (isBalanced(string)) {
printf("Keseimbangan Tanda Kurung Benar\n");
} else {
printf("Keseimbangan Tanda Kurung Salah\n");
}
return 0;
}
▪ Klik menu file Save, ketikan nama
▪ Klik Build →Build and Run atau icon
▪ berikut hasilnya
Analisi Program
Program di atas akan meminta pengguna untuk memasukkan sebuah string dan kemudian menggunakan stack untuk memeriksa keseimbangan tanda kurung dalam string tersebut. Program akan mencetak "Keseimbangan Tanda Kurung Benar" jika tanda kurung dalam string seimbang, dan "Keseimbangan Tanda Kurung Salah" jika tanda kurung tidak seimbang.
urutan kata dalam sebuah kalimat. Program harus menerima input kalimat dari pengguna dan
mengeluarkan kalimat dengan urutan kata yang terbalik.
3. Jawaban Soal stack membalikkan urutan kata dalam sebuah kalimat
▪ Buka Text Editor Code::Blocks,
▪ Pilih menu klik file → New→Empty File
▪ Ketikan koding di bawah ini
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
// Struktur Stack
struct Stack {
char data[MAX_SIZE];
int top;
};
// Fungsi push: Menambahkan elemen ke dalam stack
void push(struct Stack *stack, char element) {
if (stack->top == MAX_SIZE - 1) {
printf("Stack overflow, tidak dapat menambahkan elemen\n");
} else {
stack->top++;
stack->data[stack->top] = element;
}
}
// Fungsi pop: Menghapus elemen teratas dari stack
void pop(struct Stack *stack) {
if (stack->top == -1) {
printf("Stack underflow, tidak ada elemen yang dapat dihapus\n");
} else {
stack->top--;
}
}
// Fungsi peek: Mengambil nilai elemen teratas dari stack tanpa menghapusnya
char peek(struct Stack stack) {
if (stack.top == -1) {
return '\0';
} else {
return stack.data[stack.top];
}
}
// Fungsi isEmpty: Memeriksa apakah stack kosong
int isEmpty(struct Stack stack) {
return stack.top == -1;
}
// Fungsi reverseWords: Membalikkan urutan kata dalam kalimat menggunakan stack
void reverseWords(char sentence[]) {
struct Stack stack;
stack.top = -1;
// Memasukkan setiap kata ke dalam stack
char *word = strtok(sentence, " ");
while (word != NULL) {
int i;
for (i = 0; i < strlen(word); i++) {
push(&stack, word[i]);
}
push(&stack, ' '); // Menyisipkan spasi antara kata
word = strtok(NULL, " ");
}
// Membaca kata dari stack dan mencetaknya
while (!isEmpty(stack)) {
char ch = peek(stack);
pop(&stack);
printf("%c", ch);
}
}
int main() {
char sentence[MAX_SIZE];
printf("Masukkan kalimat: ");
fgets(sentence, sizeof(sentence), stdin);
// Menghapus karakter newline pada akhir kalimat
if (sentence[strlen(sentence) - 1] == '\n') {
sentence[strlen(sentence) - 1] = '\0';
}
printf("Kalimat terbalik: ");
reverseWords(sentence);
printf("\n");
return 0;
}
▪ Klik menu file Save, ketikan nama
▪ Klik Build →Build and Run atau icon
▪ berikut hasilnya
infix (contoh: 3 + 4) menjadi notasi postfix (contoh: 3 4 +). Program harus menerima input
ekspresi matematika dalam notasi infix dari pengguna dan mengeluarkan ekspresi dalam notasi
postfix.
4. Jawaban Soal stack untuk mengubah notasi infix
▪ Buka Text Editor Code::Blocks,
▪ Pilih menu klik file → New→Empty File
▪ Ketikan koding di bawah ini
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
// Struktur Stack
struct Stack {
char data[MAX_SIZE];
int top;
};
// Fungsi push: Menambahkan elemen ke dalam stack
void push(struct Stack *stack, char element) {
if (stack->top == MAX_SIZE - 1) {
printf("Stack overflow, tidak dapat menambahkan elemen\n");
} else {
stack->top++;
stack->data[stack->top] = element;
}
}
// Fungsi pop: Menghapus elemen teratas dari stack
void pop(struct Stack *stack) {
if (stack->top == -1) {
printf("Stack underflow, tidak ada elemen yang dapat dihapus\n");
} else {
stack->top--;
}
}
// Fungsi peek: Mengambil nilai elemen teratas dari stack tanpa menghapusnya
char peek(struct Stack stack) {
if (stack.top == -1) {
return '\0';
} else {
return stack.data[stack.top];
}
}
// Fungsi isEmpty: Memeriksa apakah stack kosong
int isEmpty(struct Stack stack) {
return stack.top == -1;
}
// Fungsi isOperator: Memeriksa apakah karakter merupakan operator
int isOperator(char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/';
}
// Fungsi precedence: Mengembalikan prioritas operator
int precedence(char ch) {
if (ch == '+' || ch == '-')
return 1;
else if (ch == '*' || ch == '/')
return 2;
return 0;
}
// Fungsi infixToPostfix: Mengubah notasi infix menjadi notasi postfix
void infixToPostfix(char infix[], char postfix[]) {
struct Stack stack;
stack.top = -1;
int i, j;
for (i = 0, j = 0; i < strlen(infix); i++) {
char ch = infix[i];
if (ch == ' ')
continue;
if (isdigit(ch) || isalpha(ch)) {
postfix[j++] = ch;
} else if (isOperator(ch)) {
while (!isEmpty(stack) && precedence(peek(stack)) >= precedence(ch)) {
postfix[j++] = peek(stack);
pop(&stack);
}
push(&stack, ch);
} else if (ch == '(') {
push(&stack, ch);
} else if (ch == ')') {
while (!isEmpty(stack) && peek(stack) != '(') {
postfix[j++] = peek(stack);
pop(&stack);
}
pop(&stack);
}
}
while (!isEmpty(stack)) {
postfix[j++] = peek(stack);
pop(&stack);
}
postfix[j] = '\0';
}
int main() {
char infix[MAX_SIZE];
char postfix[MAX_SIZE];
printf("Masukkan ekspresi infix: ");
fgets(infix, sizeof(infix), stdin);
// Menghapus karakter newline pada akhir ekspresi infix
if (infix[strlen(infix) - 1] == '\n') {
infix[strlen(infix) - 1] = '\0';
}
infixToPostfix(infix, postfix);
printf("Ekspresi postfix: %s\n", postfix);
return 0;
}
▪ Klik menu file Save, ketikan nama
▪ Klik Build →Build and Run atau icon
▪ berikut hasilnya
ekspresi postfix. Program harus menerima input ekspresi matematika dalam notasi postfix dari
pengguna dan mengeluarkan hasil perhitungannya.
5. Jawaban Soal stack untuk menghitung hasil dari ekspresi postfix
▪ Buka Text Editor Code::Blocks,
▪ Pilih menu klik file → New→Empty File
▪ Ketikan koding di bawah ini
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX_SIZE 100
// Struktur Stack
struct Stack {
int data[MAX_SIZE];
int top;
};
// Fungsi push: Menambahkan elemen ke dalam stack
void push(struct Stack *stack, int element) {
if (stack->top == MAX_SIZE - 1) {
printf("Stack overflow, tidak dapat menambahkan elemen\n");
} else {
stack->top++;
stack->data[stack->top] = element;
}
}
// Fungsi pop: Menghapus elemen teratas dari stack
void pop(struct Stack *stack) {
if (stack->top == -1) {
printf("Stack underflow, tidak ada elemen yang dapat dihapus\n");
} else {
stack->top--;
}
}
// Fungsi peek: Mengambil nilai elemen teratas dari stack tanpa menghapusnya
int peek(struct Stack stack) {
if (stack.top == -1) {
return 0;
} else {
return stack.data[stack.top];
}
}
// Fungsi isEmpty: Memeriksa apakah stack kosong
int isEmpty(struct Stack stack) {
return stack.top == -1;
}
// Fungsi evaluatePostfix: Menghitung hasil dari ekspresi postfix
int evaluatePostfix(char postfix[]) {
struct Stack stack;
stack.top = -1;
int i;
for (i = 0; i < strlen(postfix); i++) {
char ch = postfix[i];
if (isdigit(ch)) {
push(&stack, ch - '0');
} else {
int operand2 = peek(stack);
pop(&stack);
int operand1 = peek(stack);
pop(&stack);
switch (ch) {
case '+':
push(&stack, operand1 + operand2);
break;
case '-':
push(&stack, operand1 - operand2);
break;
case '*':
push(&stack, operand1 * operand2);
break;
case '/':
push(&stack, operand1 / operand2);
break;
}
}
}
return peek(stack);
}
int main() {
char postfix[MAX_SIZE];
printf("Masukkan ekspresi postfix: ");
fgets(postfix, sizeof(postfix), stdin);
// Menghapus karakter newline pada akhir ekspresi postfix
if (postfix[strlen(postfix) - 1] == '\n') {
postfix[strlen(postfix) - 1] = '\0';
}
int result = evaluatePostfix(postfix);
printf("Hasil perhitungan: %d\n", result);
return 0;
}
▪ Klik menu file Save, ketikan nama
▪ Klik Build →Build and Run atau icon
▪ berikut hasilnya
Buatlah program dalam bahasa C yang menggunakan stack untuk mengubah sebuah string menjadi palindrome. Program harus menerima input string dari pengguna dan menggunakan stack untuk memeriksa apakah string tersebut adalah palindrome atau bukan.
1. Jawaban Soal
▪ Buka Text Editor Code::Blocks,
▪ Pilih menu klik file → New→Empty File
▪ Ketikan koding di bawah ini
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
// Struktur Stack
struct Stack {
char data[MAX_SIZE];
int top;
};
// Fungsi Push
void push(struct Stack *stack, char value) {
if (stack->top == MAX_SIZE - 1) {
printf("Stack Overflow\n");
} else {
stack->top++;
stack->data[stack->top] = value;
}
}
// Fungsi Pop
char pop(struct Stack *stack) {
if (stack->top == -1) {
printf("Stack Underflow\n");
return '\0';
} else {
char value = stack->data[stack->top];
stack->top--;
return value;
}
}
// Fungsi Peek
char peek(struct Stack *stack) {
if (stack->top == -1) {
printf("Stack Kosong\n");
return '\0';
} else {
return stack->data[stack->top];
}
}
// Fungsi isEmpty
int isEmpty(struct Stack *stack) {
return stack->top == -1;
}
// Fungsi isPalindrome
int isPalindrome(char str[]) {
struct Stack stack;
stack.top = -1;
int i, len = strlen(str);
int mid = len / 2;
// Memasukkan setengah karakter pertama ke dalam stack
for (i = 0; i < mid; i++) {
push(&stack, str[i]);
}
// Membandingkan karakter dari setengah kedua dengan stack
for (i = mid + (len % 2); i < len; i++) {
if (str[i] != pop(&stack)) {
return 0;
}
}
return 1;
}
int main() {
char str[MAX_SIZE];
printf("Masukkan sebuah string: ");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0';
if (isPalindrome(str)) {
printf("String merupakan palindrome\n");
} else {
printf("String bukan palindrome\n");
}
return 0;
}
▪ Klik menu file Save, ketikan nama
▪ Klik Build →Build and Run atau icon
▪ berikut hasilnya
Comments
Post a Comment