[ Pro igrac @ 02.12.2014. 23:34 ] @
Pravim neki program koji treba da određuje da li je izraz tautologija, kontradikcija ili zadovoljiva. I sada, lepo radi u nekom slučajevima kada treba redom da određuje ali kada treba da ispoštuje pravila prednosti tipa recimo u primeru (p||q=>r)<=>(p=>r)&&(q=>r) prvo će da radi (p||q=>r)<=>(p=>r) pa tek ostalo a meni treba da odradi prvo (p||q=>r) pa (p=>r)&&(q=>r) i tek onda ekvivalenciju. Recimo tako bi računalo 4+3*2 = 14 Rađeno je preko obrnute poljske notacije. Ako neko zna šta dodati kodu i gde(još sam slab sa javom a trebam da predam ovo ubrzo). import java.util.ArrayList; import java.util.HashMap; import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ReversePolishNotation { // Spisak operatora public static final String[] OPERATORS = { "=>", "<=>", "&&", "||", "^", "(", ")", "^" }; public static boolean evaluate(String expression, HashMap<String, Boolean> values) { // Dodaje default 0 i 1 vrednosti u slucaju negacije samo jedne vrednost values.put("0", false); values.put("1", true); // Uklanja sve razmake expression = expression.replaceAll("\\s+", ""); // Pretraga karaktera za negaciju i zamenja njegovom default obrnutom // vrednoscu Pattern PATTERN = Pattern.compile("\\^[A-Za-z0-9]"); Matcher m = PATTERN.matcher(expression); while (m.find()) { String s = m.group(0).substring(1, 2); if (values.get(s) == false) expression = expression.replaceAll("\\^[A-Za-z0-9]", "1"); else expression = expression.replaceAll("\\^[A-Za-z0-9]", "0"); } // Regularni izraz za splitovanje zadatog izraza po operatorima String regex = "((?<=\\))|(?=\\)))|((?<=\\()|(?=\\())|((?<=\\b\\w+\\b)|(?=\\b\\w+\\b))"; String[] tokens = expression.split(regex); Stack<String> operators = new Stack<String>(); Stack<Boolean> operands = new Stack<Boolean>(); ArrayList<String> output = new ArrayList<String>(); for (String clan : tokens) { if (!clan.equals(")")) { if (isOperator(clan)) operators.push(clan); else output.add(clan); } else { while (operators.peek().equals("(") == false) { output.add(operators.pop()); } operators.pop(); } } // Racunanje and sit while (operators.size() != 0) { output.add(operators.pop()); } for (String item : output) { if (!isOperator(item)) { operands.push(values.get(item)); } else if (item.equals("=>")) { boolean item1 = operands.pop(); boolean item2 = operands.pop(); if (item2 == true && item1 == false) operands.push(false); else operands.push(true); } else if (item.equals("&&")) { boolean item1 = operands.pop(); boolean item2 = operands.pop(); if (item1 == true && item2 == true) operands.push(true); else operands.push(false); } else if (item.equals("||")) { boolean item1 = operands.pop(); boolean item2 = operands.pop(); if (item1 == true || item2 == true) operands.push(true); else operands.push(false); } else if (item.equals("^")) { boolean item1 = operands.pop(); operands.push(!item1); } else if (item.equals("<=>")) { boolean item1 = operands.pop(); boolean item2 = operands.pop(); if (item1 == item2) operands.push(true); else operands.push(false); } } return operands.pop(); } private static boolean isOperator(String s) { for (String operator : OPERATORS) { if (s.equals(operator)) return true; } return false; } } |