私はAndroidのプログラミング(Androidスタジオを使用して)を教えて、私は基本的な電卓のアプリに取り組んでいます。私のevalメソッドはDijkstraのshunting-yardアルゴリズムを使用して文字列式を解析し、その結果を計算します。私はthis SO questionからこれのアイデアを得ました。次のようにJava - Stack.popに最後の項目が返されない
私の評価者クラスのコードは次のとおりです。
class Evaluator {
private static Evaluator instance = new Evaluator();
private Stack<String> mOperators;
private Stack<Double> mOperands;
public static Evaluator getInstance() {
return instance;
}
private Evaluator() {
mOperands = new Stack<Double>();
mOperators = new Stack<String>();
}
public Double eval(String expression) {
Stack stack = convertExpressionToStack(expression);
buildOperationStacks(stack);
return doEval();
}
private Double doEval() {
while (!mOperators.isEmpty()) {
String op = mOperators.pop();
Double v = mOperands.pop();
switch (op) {
case "+":
v = mOperands.pop() + v;
break;
case "-":
v = mOperands.pop() - v;
break;
case "*":
v = mOperands.pop() * v;
break;
case "/":
v = mOperands.pop()/v;
break;
}
mOperands.push(v);
}
return mOperands.pop();
}
private void buildOperationStacks(Stack stack) {
while (!stack.isEmpty()) {
String s = (String) stack.pop();
switch (s) {
case "+":
case "-":
case "*":
case "x":
case "X":
case "/":
case "÷":
if (s.equals("x") || s.equals("X")) {
s = "*";
} else if (s.equals("÷")) {
s = "/";
}
mOperators.push(s);
break;
default:
try {
if (!stack.isEmpty() && stack.peek().equals (".")) {
s += stack.pop();
s += stack.pop();
}
mOperands.push(Double.parseDouble(s));
} catch (Exception e) {
Log.e("Error", e.getMessage());
}
}
}
}
private Stack convertExpressionToStack(String expression) {
Stack<String> s = new Stack<String>();
for (char c : expression.toCharArray()) {
s.push(String.valueOf(c));
}
return s;
}
}
だから私の問題は、doEval方法です。各スタックから要素をポップすると、各スタックに最初の要素が追加されています。私はスタックがFirst In Last Out構造であったという印象を受けました。
どうしたらいいですか?どうやら各スタックを逆転させる必要がありますか?
ありがとうございます。
EDIT
ですから、例えば、I入力5 + 3 * 2。私はこれをデバッグするとき、私は見ています、実行はしかし
pass 1: value1 = 2, Operator1 = *, value2 = 3 result = 6
pass 2: Value1 = 6 (result of pass 1) Operator1 = +, value2 = 5 result = 11
ことを期待する:スタックの
pass 1: value1 = 5, Operator1 = +, value2 = 3, result = 8
pass 2: value1 = 8 (result of pass 1), operator1 = *, value2 = 2, result = 16
スタックはLIFOで、http://docs.oracle.com/javase/を参照してください8/docs/api/java/util/Stack.html –
@RC。 - 仰るとおりです。 First Out Last OutはLast In First Outと同じです。しかし、私のスタックはFirst In First Outとして機能しています。私は彼らがなぜこのように行動しているのか理解していません –
LIFOはFILOと同じではありませんか?しかし、あなたがライフやフィロを使っているかどうかは関係ありません。しかし、それは同じではありません –