-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhaloapakabar.cpp
119 lines (106 loc) · 2.86 KB
/
haloapakabar.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
A11.2021.13937
Hafizh Hugo Harman
*/
#include <iostream>
using namespace std;
#define MAXSTACK 35
#define stackpenuh true
#define stackalfabet false
struct pesan {
char data[MAXSTACK];
int top;
};
pesan stackPenuh;
pesan stackAlfabet;
void fixPesan(string);
void initStack(bool);
void tampil(bool);
bool isFull(bool);
bool isEmpty(bool);
void push(char,bool);
void pop(bool);
bool isAlphabet(char);
int main() {
/*
Si Fulan mendapat pesan dari temannya, namun pesan tersebut rusak seperti yang tertera sebagai berikut
H**AL***O**AP***AK*A**B*****A*R****
Dengan menggunakan konsep stack, bantulah Fulan menghilangkan tanda * sehingga akan muncul tulisan HALOAPAKABAR.
Ketentuan:
Jika ketemu *, maka lakukan pop, jika ketemu alfabet, lakukan push.
Hint:
1. Pesan yang diterima Fulan bisa dianggap sebagai stack yang sudah penuh
2. Buatlah satu stack tambahan untuk menampung alfabet
3. Tampilkan stack yang menampung alfabet
*/
string text = "H**AL***O**AP***AK*A**B*****A*R***";
//inisialisasi stack penuh dan stack penampung alfabet
initStack(stackpenuh);
initStack(stackalfabet);
fixPesan(text);
tampil(stackalfabet);
return 0;
}
void fixPesan(string text) {
int sizePesan = text.size();
while (sizePesan--) {
push(text[stackPenuh.top], stackpenuh);
}
while (!isEmpty(stackpenuh) && (stackPenuh.data[stackPenuh.top] == '*' || !isAlphabet(stackPenuh.data[stackPenuh.top]))) {
//Pop dalam stack hanya bisa mengambil bagian atas dari stack
pop(stackpenuh);
}
for (char ch : stackPenuh.data)
{
if (stackAlfabet.top == stackPenuh.top) break;
push(ch, stackalfabet);
if (ch == '*' || !isAlphabet(ch))
{
pop(stackalfabet);
}
}
}
void initStack(bool stackType) {
auto stack = (stackType) ? stackPenuh : stackAlfabet;
stack.top = -1;
}
bool isAlphabet(char chr) {
int z = (int)chr;
//Jika huruf A-Z & jika huruf a-z (ascii character number)
return ((z >= 65 && z <= 90) || (z >= 97 && z <= 122)) ? true : false;
}
bool isFull(bool stackType) {
return (((stackType) ? stackPenuh.top : stackAlfabet.top) == MAXSTACK - 1) ? true : false;
}
bool isEmpty(bool stackType) {
return (((stackType) ? stackPenuh.top : stackAlfabet.top) == -1) ? true : false;
}
void push(char huruf, bool stackType) {
auto &stack = (stackType) ? stackPenuh : stackAlfabet;
if(isFull(stackType)){
cout << "stack penuh!\n";
}
else {
stack.top++;
stack.data[stack.top] = huruf;
//cout << huruf << " dimasukan kedalam " << ((stackType) ? "stackpenuh(pesan)" : "stackalfabet") << "!\n";
}
}
void pop(bool stackType) {
auto &stack = (stackType) ? stackPenuh : stackAlfabet;
if (isEmpty(stackType)) {
cout << "stack kosong !\n";
}
else {
stack.data[stack.top] = NULL;
stack.top--;
}
}
void tampil(bool stackType) {
auto &stack = (stackType) ? stackPenuh : stackAlfabet;
cout << "Isi dari stack : \n";
for (int i = 0; i <= stack.top; i++) {
cout << stack.data[i];
}
cout << "\n";
}