diff --git a/group02/812350401/.gitignore b/group02/812350401/.gitignore index 8cd204f114..8380fddb34 100644 --- a/group02/812350401/.gitignore +++ b/group02/812350401/.gitignore @@ -4,3 +4,4 @@ src/main/java/train/ !src/main/resources/**/*.class !src/main/resources/**/*.xml src/main/resources/**/*.png +src/main/java/assignments diff --git a/group02/812350401/pom.xml b/group02/812350401/pom.xml index 6ad5aa08db..596d874817 100644 --- a/group02/812350401/pom.xml +++ b/group02/812350401/pom.xml @@ -50,6 +50,13 @@ commons-lang3 3.4 + + + io.reactivex.rxjava2 + rxjava + 2.0.8 + + diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExpr.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExpr.java new file mode 100644 index 0000000000..92727ce984 --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExpr.java @@ -0,0 +1,134 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + +import java.util.LinkedList; +import java.util.List; +import java.util.Stack; + +public class InfixExpr { + private String expr = null; + enum Operator { + PLUS("+", 1), SUB("-", 1), MUL("*", 2), DIV("/", 2); // 优先级越大,说明应该先算 + private String value; + private int priority; + Operator(String value, int prioriy) { + this.value = value; + this.priority = prioriy; + } + public static Operator parseOperator(String value) { + for (Operator c : Operator.values()) { + if (c.value.equals(value)) { + return c; + } + } + throw new RuntimeException("运算符不存在"); + } + } + + public InfixExpr(String expr) { + this.expr = expr; + } + private static Token evaluate(Token operator, Token number1, Token number2) { + float ret; + switch (operator.value) { + case PLUS: + ret = number1.getValue() + number2.getValue(); + break; + case SUB: + ret = number1.getValue() - number2.getValue(); + break; + case MUL: + ret = number1.getValue() * number2.getValue(); + break; + case DIV: + ret = number1.getValue() / number2.getValue(); + break; + default: + throw new RuntimeException("运算符不存在"); + } + return new Token(ret, true); + } + + + public float evaluate() { + List tokens= Token.parse(expr); + Stack> numberStack = new Stack<>(); + Stack> operatorStack = new Stack<>(); + for (Token t : tokens) { + if (t.isNumber()) { + numberStack.push(t); + } else { + if (operatorStack.isEmpty()) { + operatorStack.push(t); + } else { + Token preT = operatorStack.peek(); + if ((preT.value).priority >= ((Operator)t.value).priority) { + Token number2 = numberStack.pop(); + Token number1 = numberStack.pop(); + operatorStack.pop(); + numberStack.push(evaluate(preT, number1, number2)); + } + operatorStack.push(t); + + } + } + } + while (!operatorStack.isEmpty()) { + Token number2 = numberStack.pop(); + Token number1 = numberStack.pop(); + Token operator = operatorStack.pop(); + numberStack.push(evaluate(operator, number1, number2)); + } + return numberStack.pop().getValue(); + } + + + private static class Token { + private boolean number; // 是数字/操作符 + private T value; + public boolean isNumber() { + return number; + } + public T getValue() { + return value; + } + + public Token(T value, boolean number) { + this.value = value; + this.number = number; + } + public static List parse(String expr) { + int i = 0; + int size = expr.length(); + String current; + List tokens = new LinkedList<>(); + String value = ""; + while (i < size) { + current = expr.substring(i,i+1); + if (isOperator(current)) { + tokens.add(new Token(Float.parseFloat(value), true)); + value = ""; + tokens.add(new Token(Operator.parseOperator(current), false)); + } else { + value += current; + } + i++; + } + tokens.add(new Token(Float.parseFloat(value), true)); + return tokens; + } + + private static boolean isOperator(String value) { + for (Operator c : Operator.values()) { + if (c.value.equals(value)) { + return true; + } + } + return false; + } + } + + public static void main(String[] args) { + + + } +} diff --git a/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java new file mode 100644 index 0000000000..706aaea86e --- /dev/null +++ b/group02/812350401/src/main/java/com/github/miniyk2012/coding2017/basic/stack/expr/InfixExprTest.java @@ -0,0 +1,52 @@ +package com.github.miniyk2012.coding2017.basic.stack.expr; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + + +public class InfixExprTest { + + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testEvaluate() { + //InfixExpr expr = new InfixExpr("300*20+12*5-20/4"); + { + InfixExpr expr = new InfixExpr("2+3"); + Assert.assertEquals(5.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("2+3*4+5"); + Assert.assertEquals(19.0, expr.evaluate(), 0.001f); + } + { + InfixExpr expr = new InfixExpr("3*20+12*5-40/2"); + Assert.assertEquals(100.0, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("3*20/2"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("20/2*3"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + { + InfixExpr expr = new InfixExpr("10-30+50"); + Assert.assertEquals(30, expr.evaluate(), 0.001f); + } + + } + +}