-->

I'M Bayu Pradika

Graphic Designer . Web Developer . Programmer

Jumat, 19 Agustus 2022

Contoh Percobaan dan Latihan Program C++(Stack)

 

Pada Artikel Ini Saya Akan Menulis Sedikit Contoh Penggunaan Stack Dalam Bahasa C++ 

~~Selamat Membaca~~

A. Contoh Dasar Dari Program Stack dalam C++

Percobaan 1 : Penerapan Fungsi-Fungsi Tumpukan, Memasukkan Isi Tumpukan & Menampilkan Isi Tumpukan

Berikut Contoh Source Code nya:

#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(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));

 }

}

Berikut Output Program nya: 


Percobaan 2 : Program Merubah Notasi Infix menjadi Postfix

Berikut Contoh Source Code nya:

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

}

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)) //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

}

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': case

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

   while(tumpukan.item[tumpukan.count] != '(')

   {

    smtr = Pop(&tumpukan);

    printf("%c", smtr);

   }

    Pop(&tumpukan);

    break;

    default : //selain dari kar yang diijinkan

    valid = 0;

    puts("INVALID STSTEMEN");

    break;

    } //end of switch-case

   } //end of looping for

    if((valid != 0) && (!Empty(&tumpukan)))

    {

        smtr = Pop(&tumpukan);

        printf("%c", smtr);

    }

}

Berikut Output Program nya:


B. Contoh Soal Program Menggunakan Stack Dalam C++

1. Lakukan operasi berikut : • Jika karakter maka push ke stack • Jika asterisk (*) maka pop dan cetak hasilnya. Bagaimana output program dengan input seperti di bawah ini ? E A S * Y * Q U E * * * S T * * * I O * N * * *

Berikut program nya:

#include <stdio.h>

#define MAKS 40

int p = 0;

typedef char tipe;

typedef struct

{

 char item[MAKS];

 int count;

} Stack;

void insialisasi(Stack *S)

{

 S->count = 0;

}

int penuh(Stack *S)

{

 return (S->count == MAKS);

}

int kosong(Stack *S)

{

 return (S->count == 0);

}

void push(tipe x, Stack *S)

{

 if (penuh(S))

 printf("Stack tidak dapat ditambah karna sudah penuh\n");

 else

 {

  S->item[S->count] = x;

  printf("Stack berada di diindex ke %d\n", x, S->count);

  ++(S->count);

 }

}

 

int pop(Stack *S, char cetak[MAKS])

{

 if (kosong(S))

 printf("maaf stack masih kosong\n");

 else

 {

  --(S->count);

  cetak[p] = S->item[S->count];

  printf("%c Telah Dikeluarkan dari stack \n", S->item[S->count]);

 }

 return p;

}

void isi(Stack *S)

{

 int a = 0;

 printf("Isi  : ");

 while (a < S->count)

 printf("%c", S->item[a++]);

 printf("\n");

}

int main()

{

 char cetak[MAKS];

 int a, b;

 int c;

 char input;

 Stack tumpukan;

 insialisasi(&tumpukan);

 printf("Masukkan input, jika char maka akan masuk ke dalam stack lalu cetak hasilnya\n");

 for (a = 0; a != MAKS; a++)

 {

  printf("Huruf :  ");

  scanf("%c", &input);

  fflush(stdin);

  if (input == '*' || input == '/' || input == '-' || input == '+')

  {

   c = pop(&tumpukan, cetak);

   isi(&tumpukan);

   b = 0;

   printf("Silahkan Mengisi stack : \n");

   while (b < p)

   printf(" %d\n", cetak[b++]);

  }

  else if (input == '^')

  {

   break;

  }

  else

  push(input, &tumpukan);

}

 for (a = 0; a < c; a++)

 {

  printf("%c ", cetak[a]);

 }

}

Berikut Output Program nya: 

2. Buatlah sebuah program yang melakukan konversi dari bilangan desimal ke bilangan biner, octal, heksa dengan menggunakan stack

Berikut program nya:

#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))

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

 else

 {

  --(S->Count);

  return (S->Item[S->Count]);

 }

}

int main()

{

 int i, n, hitung, input, temp;

 Stack tumpukan;

InisialisasiStack(&tumpukan);

 printf("Masukkan angka desimal, yang akan dikonversikan ke biner, oktal, dan heksadesimal\n");

 printf("User Input : ");

 scanf("%d", &input);

 fflush(stdin);

 n = input;

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

 {

  hitung = i + 1;

  temp = n % 2;

  Push(temp, &tumpukan);

  n = n / 2;

 }

 printf("\nBiner: ");

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

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

 n = input;

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

 {

  hitung = i + 1;

  temp = n % 8;

  Push(temp, &tumpukan);

  n = n / 8;

 }

 printf("\nOktal: ");

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

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

 n = input;

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

 {

  hitung = i + 1;

  temp = n % 16;

  Push(temp, &tumpukan);

  n = n / 16;

 }

 printf("\nHeksadesimal: ");

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

 {

  temp = Pop(&tumpukan);

  if (temp <= 9)

  printf("%d", temp);

  else

  printf("%c", temp + 55);

 }

}

Berikut Output Program nya:

 

3. Buatlah sebuah program yang melakukan pembalikan terhadap kalimat dengan menggunakan stack  Contoh: Kalimat : Struktur Data Hasil setelah dibalik : ataD rutkurtS

Berikut program nya:

#include <stdio.h>

#include <conio.h>

#include <string.h>

char balik(char x[50]);

char cek(char y[50], char z[50]);

int main()

{

 char m[50], o[50];

 printf("Silahkan Input Kalimat Yang Mau Dibalik\n");

 printf("User Input : ");

 gets(m);

 strcpy(o, m);

 balik(o);

 getch();

}

char balik(char x[50])

{

 strrev(x);

 printf("Hasil Pembalikan : %s", x);

}

Berikut Output Program nya: 


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. Contoh: Kalimat : sugus Kalimat tersebut adalah palindrom

Berikut program nya:

#include <stdio.h>

#include <conio.h>

#include <string.h>

char balik(char x[50]);

char cek(char y[50], char z[50]);

int main()

{

 char m[50], o[50];

 printf("Silahkan Masukan Kalimat Yang Mau Dicek\n");

 printf("User Input : ");

 gets(m);

 strcpy(o, m);

 balik(o);

 cek(m, o);

 getch();

 printf("Silahkan Masukan lagi Kalimat Yang Mau Dicek\n");

 printf("User Input : ");

 gets(m);

 strcpy(o, m);

 balik(o);

 cek(m, o);

 getch();

}

char balik(char x[50])

{

 strrev(x);

}

char cek(char y[50], char z[50])

{

 if (strcmp(y, z) == 0)

 {

 printf("\nKalimat tersebut adalah palindrom\n\n");

 }

 else

 {

 printf("\nKalimat tersebut bukan palindrom\n\n");

 }

}

Berikut Output Program nya: 


5. Tambahkan implementasi Percobaan2 untuk mengecek apakah notasi infix yang diinputkan benar atau tidak. Contoh : Infix : 5 * ( 4 – 2 Output : Notasi infix salah, kurung tidak lengkap Infix : 5 * ( 4 – ) Output : Notasi infix salah, operand tidak lengkap Infix : 5 ( 4 – 2 ) Output : Notasi infix salah, operator tidak lengkap

Berikut Program nya:

#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("Input Notasi Infix Yang Mau Dicek: \n");

 printf("User Input : ");

 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;

}

Berikut Output Program nya: 


6. Tambahkan implementasi Percobaan2 hingga mendapatkan hasil penghitungannya. Contoh: infix : 5 * ( 4 – 2 ) postfix : 542-* hasil : 10

Berikut Program nya:

#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("Input Notasi Infix Yang Mau Dicek: \n");

 printf("User Input : ");

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

   printf("%c", postfix[j]);

  }

  else if (infix[i] == '(')

  {

   Push(&t, infix[i]);

  }

  else if (infix[i] == ')')

  {

   while (t.item[t.count - 1] != '(')

   {

    postfix[j++] = Pop(&t);

    printf("%c", postfix[j]);

   }

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

    printf("%c", postfix[j]);

   }

   Push(&t, infix[i]);

  }

 }

 else if (infix[i] == ' ')

 continue;

 else

 printf("Notasi salah\n");

}

while (!Kosong(&t))

{

 postfix[j++] = Pop(&t);

 printf("%c", postfix[j]);

}

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;

}

Berikut Output Program nya: 




Baca Juga:
1. Algoritma Dan Struktur Data C++ BAB I (Array, Pointer, Struktur)

2. Contoh Program C++ Tentang Array, Pointer, Dan Struktur

3. Algoritma Dan Struktur Data C++ BAB II (Stack)

 

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna Veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.

0 comments:

Categories

Contact Us

BAYU
+62 896-2690-9619
Kampar, Riau, Indonesia