diff --git a/src/main/java/algorithm/datastructure/Stack/BalancedBracket.java b/src/main/java/algorithm/datastructure/Stack/BalancedBracket.java new file mode 100644 index 0000000..44bf9e0 --- /dev/null +++ b/src/main/java/algorithm/datastructure/Stack/BalancedBracket.java @@ -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 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("[(])"); + } +} diff --git a/src/main/java/algorithm/datastructure/Stack/InfixToPostfix.java b/src/main/java/algorithm/datastructure/Stack/InfixToPostfix.java new file mode 100644 index 0000000..d9f4e27 --- /dev/null +++ b/src/main/java/algorithm/datastructure/Stack/InfixToPostfix.java @@ -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 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 { + + } +}