package stack.expr;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingDeque;
public class TParser {
Queue<Integer> intQ;
Queue<String> signQ;
static final List<String> signs = new ArrayList<String>();
{
signs.add("+");
signs.add("-");
signs.add("*");
signs.add("/");
}
public TParser() {
intQ = new LinkedBlockingDeque<Integer>();
signQ = new LinkedBlockingDeque<String>();
}
public void parse(String expr) {
String[] tokens = expr.split("");
String number = "";
for (int i = 0; i < tokens.length; i++) {
String c = tokens[i];
if (isSign(c)) {
signQ.add(c);
int num = Integer.parseInt(number);
intQ.add(num);
number = "";
} else {
number += tokens[i];
}
}
int num = Integer.parseInt(number);
intQ.add(num);
int intSize = intQ.size();
if (intSize < 2 || intSize - signQ.size() > 1) {
throw new RuntimeException("Invalid input IntQ: " + intQ + " signQ " + signQ);
}
intQ.add(0);
}
private boolean isSign(String c) {
if (signs.contains(c)) {
return true;
}
return false;
}
public int nextInt() {
return intQ.poll();
}
public String nextSign() {
return signQ.poll();
}
public boolean hasNextInt() {
return !intQ.isEmpty();
}
public boolean hasNextSign() {
return !signQ.isEmpty();
}
}