From b75156a4d44198eab8d87ad3f87aaedf0180d4f6 Mon Sep 17 00:00:00 2001 From: Xawirses Date: Tue, 7 Mar 2017 12:57:49 +0100 Subject: [PATCH] Add Read & infix to prefix algo --- src/Expression.java | 109 ++++++++++++++++++++++++++++++++++++++++++++ src/Operator.java | 9 ++++ 2 files changed, 118 insertions(+) create mode 100644 src/Expression.java create mode 100644 src/Operator.java diff --git a/src/Expression.java b/src/Expression.java new file mode 100644 index 0000000..f027596 --- /dev/null +++ b/src/Expression.java @@ -0,0 +1,109 @@ +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.LinkedList; +import java.util.List; +import java.util.Stack; + +/** +* Created by xawirses on 28/02/17. + */ +public class Expression { + private String expression; + + public Expression(){ + readExpression(); + parse(); + } + + public void readExpression(){ + try { + BufferedReader buff = new BufferedReader(new InputStreamReader(System.in)); + expression = buff.readLine(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private String reverseExpression(String exp) { + String reverse = ""; + for (int i = exp.length()-1; i >= 0; i--) { + char c = exp.charAt(i); + switch (c) { + case '(': + reverse += ")"; + break; + + case ')': + reverse += "("; + break; + + default: + reverse += c; + } + + } + return reverse; + } + + private boolean isParenthesis(char c) { + return c == '(' || c == ')'; + } + + private boolean isOperator(char c) { + for (int i = 0; i < Operator.nbOperators; i++) { + if(Operator.operators[i] == c) + return true; + } + return false; + } + + private boolean isHighterOperator(char current, char stack) { + int pCurrent = 0; + int pStack = 0; + + for (int i = 0; i < Operator.nbOperators; i++) { + if(Operator.operators[i] == current) + pCurrent = i; + if(Operator.operators[i] == stack) + pStack = i; + } + return (pCurrent >= pStack); + } + + private void parse() { + String reverse = reverseExpression(expression); + String reversePrefix = ""; + + LinkedList stack = new LinkedList(); + for (int i = 0; i < reverse.length(); i++) { + char c = reverse.charAt(i); + if (!isOperator(c)) { + reversePrefix += c; + } else if(c == '(') { + stack.addLast(String.valueOf(c)); + } else if(isOperator(c) && !isParenthesis(c)) { + while (!stack.isEmpty() && !isParenthesis(stack.peekLast().charAt(0)) && isHighterOperator(c, stack.peekLast().charAt(0))) { + reversePrefix += stack.pollLast(); + } + stack.addLast(String.valueOf(c)); + } else if(c == ')') { + while (!stack.peekLast().equals("(")) { + System.out.println(reversePrefix); + System.out.println(stack.peekLast()); + reversePrefix += stack.pollLast(); + } + stack.pollLast(); + } else { + System.err.println("WTF !!"); + } + } + while (!stack.isEmpty()) + reversePrefix += stack.pollLast(); + System.out.println(reverseExpression(reversePrefix)); + } + + public static void main(String[] args) { + Expression e = new Expression(); + } +} diff --git a/src/Operator.java b/src/Operator.java new file mode 100644 index 0000000..a67a124 --- /dev/null +++ b/src/Operator.java @@ -0,0 +1,9 @@ +/** + * Created by xawirses on 28/02/17. + */ + +public class Operator { + + public static final int nbOperators = 9; + public static final char operators[] = {'!', 'L', 'M', '(', ')', '&', '|', '>', '='}; +} \ No newline at end of file