Skip to content

Commit fe2e9c3

Browse files
authored
Merge pull request onlyliuxin#182 from DonaldY/master
24组 第6周作业
2 parents 53a0839 + 35e11d0 commit fe2e9c3

File tree

400 files changed

+18504
-294
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

400 files changed

+18504
-294
lines changed

group24/1148285693/learning2017/learning-basic/src/main/java/me/lzb/basic/InfixExpr.java

Lines changed: 0 additions & 161 deletions
This file was deleted.
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package me.lzb.basic.expr;
2+
3+
import me.lzb.common.utils.StringUtils;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import java.util.Stack;
8+
9+
/**
10+
* Created by LZB on 2017/4/20.
11+
*/
12+
public class CalUtil {
13+
14+
15+
public static void calculate(Stack<String> symbolStack, Stack<Float> numberStack, boolean isRe) {
16+
if (symbolStack.isEmpty()) {
17+
return;
18+
}
19+
20+
21+
String symbole = symbolStack.pop();
22+
23+
float right;
24+
float left;
25+
26+
if (isRe) {
27+
left = numberStack.pop();
28+
right = numberStack.pop();
29+
} else {
30+
right = numberStack.pop();
31+
left = numberStack.pop();
32+
}
33+
34+
float r = calculate(symbole, left, right);
35+
36+
numberStack.push(r);
37+
}
38+
39+
40+
public static float calculate(String symbol, float left, float right) {
41+
if ("+".equals(symbol)) {
42+
return left + right;
43+
}
44+
45+
if ("-".equals(symbol)) {
46+
return left - right;
47+
}
48+
49+
if ("*".equals(symbol)) {
50+
return left * right;
51+
}
52+
53+
if ("/".equals(symbol)) {
54+
return left / right;
55+
}
56+
57+
return 0;
58+
}
59+
60+
61+
public static List<Node> processInfixExpr(String expr) {
62+
List<Node> list = new ArrayList<>();
63+
char[] array = expr.toCharArray();
64+
String number = "";
65+
for (int i = 0; i < array.length; i++) {
66+
if (Character.isDigit(array[i])) {
67+
number = number + String.valueOf(array[i]);
68+
} else {
69+
if (StringUtils.isNotBlank(number)) {
70+
Node num = new Node(Float.valueOf(number), null, -1);
71+
number = "";
72+
list.add(num);
73+
}
74+
75+
int calLevel = 1;
76+
77+
if ("*/".indexOf(array[i]) >= 0) {
78+
calLevel = 2;
79+
}
80+
81+
if ("()".indexOf(array[i]) >= 0) {
82+
calLevel = 3;
83+
}
84+
85+
Node sym = new Node(0, String.valueOf(array[i]), calLevel);
86+
87+
list.add(sym);
88+
}
89+
}
90+
if (StringUtils.isNotBlank(number)) {
91+
Node num = new Node(Float.valueOf(number), null, -1);
92+
list.add(num);
93+
}
94+
95+
return list;
96+
}
97+
98+
99+
public static boolean isLowLevel(Node stackTop, Node next) {
100+
return stackTop.calLevel < next.calLevel;
101+
}
102+
103+
public static void main(String[] args) {
104+
Node n = new Node(0, "*", 2);
105+
Node m = new Node(0, "-", 1);
106+
System.out.println(isLowLevel(n, m));
107+
}
108+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package me.lzb.basic.expr;
2+
3+
import java.util.List;
4+
import java.util.Stack;
5+
6+
/**
7+
* 中序表达式
8+
* Created by LZB on 2017/4/15.
9+
*/
10+
public class InfixExpr {
11+
12+
13+
private String expr;
14+
15+
public InfixExpr(String expr) {
16+
this.expr = expr;
17+
}
18+
19+
public float evaluate() {
20+
21+
List<Node> list = CalUtil.processInfixExpr(expr);
22+
23+
Stack<String> symbolStack = new Stack<>();
24+
Stack<Float> numberStack = new Stack<>();
25+
26+
boolean calLevel2 = false;
27+
for (Node n : list) {
28+
if (n.isNumber()) {
29+
numberStack.push(n.number);
30+
if (calLevel2) {
31+
CalUtil.calculate(symbolStack, numberStack, false);
32+
calLevel2 = false;
33+
}
34+
} else {
35+
symbolStack.push(n.symbol);
36+
37+
if (n.isLevel2()) {
38+
calLevel2 = true;
39+
}
40+
}
41+
}
42+
43+
44+
Stack<Float> tn = new Stack<>();
45+
int nsize = numberStack.size();
46+
for (int i = 0; i < nsize; i++) {
47+
tn.push(numberStack.pop());
48+
}
49+
50+
numberStack = tn;
51+
52+
53+
Stack<String> ts = new Stack<>();
54+
int ssize = symbolStack.size();
55+
for (int i = 0; i < ssize; i++) {
56+
ts.push(symbolStack.pop());
57+
}
58+
59+
symbolStack = ts;
60+
61+
62+
while (!symbolStack.isEmpty()) {
63+
CalUtil.calculate(symbolStack, numberStack, true);
64+
}
65+
66+
67+
return numberStack.pop();
68+
}
69+
70+
71+
}

0 commit comments

Comments
 (0)