Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package algorithm.datastructure.Stack;

/**
* tanda kurung bersarang adalah problem dimana menentukan
* apakah urutan tanda kurung bersarang dengan benar
* urutan tanda kurung s dianggap benar bersarang
* jika salah satu kondisi berikut
* - S kosong
* - s memiliki bentuk
* (U) atau [U] atau {U}
* dimana U ini adalah string bersarang yang benar
*/
import java.util.Stack;

class BalancedBracket {
public static boolean telahTersambung(char bracketKiri, char bracketKanan) {
char[][] bracketSambungan = {
{'(', ')'},
{'[', ']'},
{'{', '}'},
{'<', '>'},
};
for (char[] bracketTersambung : bracketSambungan) {
if (bracketTersambung[0] == bracketKiri && bracketTersambung[1] == bracketKanan) {
return true;
}
}
return false;
}

public static boolean bracketSesuai(String brackets) {
if (brackets == null) {
throw new IllegalArgumentException("bracket null");
}
Stack<Character> bracketStack = new Stack<>();
for (char bracket : brackets.toCharArray()) {
switch (bracket) {
case '(':
case '{':
case '[':
bracketStack.push(bracket);
break;
case ')':
case '}':
case ']':
if (bracketStack.isEmpty() || !telahTersambung(bracketStack.pop(), bracket)) {
return false;
}
break;
default:
return false;
}
}
return bracketStack.isEmpty();
}

public static void main(String[] arags) {
assert bracketSesuai("[()]{}{[()()]()}");
assert !bracketSesuai("[(])");
}
}
61 changes: 61 additions & 0 deletions src/main/java/algorithm/datastructure/Stack/InfixToPostfix.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package algorithm.datastructure.Stack;

/**
* notasi infix adalah notasi dimana operator berada diantara
* operan yang diperlukan. notasi postfix adalah jenis notasi
* dimana operator muncul setelah operan
*
* ekspresi infix -> A + B * C + D
* ke eksprei postfix menjadi -> ABC * + D +
*/
import java.util.Stack;

public class InfixToPostfix {

public static String infixToPostfix(String ekspresiInfix) throws Exception {
if (!BalancedBracket.bracketSesuai(ekspresiInfix)) {
throw new Exception("ekspresi salah");
}
StringBuilder output = new StringBuilder();
Stack<Character> stack = new Stack<>();
for (char element : ekspresiInfix.toCharArray()) {
if (Character.isLetterOrDigit(element)) {
output.append(element);
} else if (element == '(') {
stack.push(element);
} else if (element == ')') {
while (!stack.isEmpty() && stack.peek() != '(') {
output.append(stack.pop());
}
stack.pop();
} else {
while(!stack.isEmpty() && ekspresi(element) <= ekspresi(stack.peek())) {
output.append(stack.pop());
}
stack.push(element);
}
}
while (!stack.isEmpty()) {
output.append(stack.pop());
}
return output.toString();
}

private static int ekspresi(char operator) {
switch (operator) {
case '+':
case '-':
return 0;
case '*':
case '/':
return 1;
case '^':
return 2;
default:
return -1;
}
}
public static void main(String[] args) throws Exception {

}
}