PRAKTIKUM 8: Mengimplementasikan struktur data stack

 1. Buatlah program dalam bahasa C yang mengimplementasikan stack menggunakan array untuk
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

Program di atas mengimplementasikan stack menggunakan array dan menyediakan fungsi-fungsi yang diminta. Anda dapat menjalankan program tersebut untuk menguji operasi-operasi dasar stack seperti push, pop, peek, isEmpty, dan isFull.


2. Buatlah program dalam bahasa C yang menerima input string dari pengguna dan menggunakan
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.


3. Buatlah program dalam bahasa C yang mengimplementasikan stack untuk membalikkan
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

    



4. Buatlah program dalam bahasa C yang mengimplementasikan stack untuk mengubah notasi
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

    



5. Buatlah program dalam bahasa C yang menggunakan stack untuk menghitung hasil dari
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

    



Studi Kasus implementasi operasi dasar stack
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

Popular posts from this blog

PRAKTIKUM 11: Menggunakan struktur data tree dalam pemrograman

PRAKTIKUM 3: Menggunakan fungsi dan prosedur dalam pemrograman

1 .pengantar pemrograman