Javaを使用して数式の値を求める
2614 ワード
数学式の値を求める方法については、ネット上には多くのチュートリアルがあります.しかし、ほとんどのチュートリアルは1つのDemoにすぎず、このDemoは1桁の4則演算しか実現せず、1桁以上の計算に遭遇すると問題が発生します.本稿では,これに基づいて拡張を行い,ビット数以上の4則演算を実現した.
全体的な考え方:
入力した式は接尾辞式で、その式を後続式に変換してスタックで演算します.
接尾辞式を接尾辞式に変換する方法:(接尾辞式の各要素をlistで格納し、スタックstackで演算子を一時的に格納)
1:数値に遭遇した場合:リストに挿入します.
2:演算子に遭遇した場合:演算子の乗数または除算時にスタックに直接入力します.演算子にマイナス記号を付ける場合:スタックが空の場合は直接スタックに入ります.そうでなければ、スタックトップ演算子topOperを取得し(ポップアップではなく取得するので、popではなくpeekを使用します)、topOperが左かっこの場合、直接スタックに入ります.そうでなければ、スタック内の左かっこの上の要素を循環してlistに加え、最後に現在の演算子をスタックに入れます.
3:左かっこ("(")に遭遇した場合、直接スタックに入る;
4:右かっこが発生した場合(「)」)、順次スタックを出て、スタック演算子が左かっこの場合、終了します.
5:最終的にスタック内の各要素を順次スタックからリストに入れます.
接尾辞式を使用して評価する方法:
リスト内の各要素を順次巡回してスタックに入れ、得られた要素が演算子である場合、スタックの上部の2つの要素を取り出して演算し、リストの巡回が完了するまで演算結果をスタックに入れます.
コードは次のとおりです.
全体的な考え方:
入力した式は接尾辞式で、その式を後続式に変換してスタックで演算します.
接尾辞式を接尾辞式に変換する方法:(接尾辞式の各要素をlistで格納し、スタックstackで演算子を一時的に格納)
1:数値に遭遇した場合:リストに挿入します.
2:演算子に遭遇した場合:演算子の乗数または除算時にスタックに直接入力します.演算子にマイナス記号を付ける場合:スタックが空の場合は直接スタックに入ります.そうでなければ、スタックトップ演算子topOperを取得し(ポップアップではなく取得するので、popではなくpeekを使用します)、topOperが左かっこの場合、直接スタックに入ります.そうでなければ、スタック内の左かっこの上の要素を循環してlistに加え、最後に現在の演算子をスタックに入れます.
3:左かっこ("(")に遭遇した場合、直接スタックに入る;
4:右かっこが発生した場合(「)」)、順次スタックを出て、スタック演算子が左かっこの場合、終了します.
5:最終的にスタック内の各要素を順次スタックからリストに入れます.
接尾辞式を使用して評価する方法:
リスト内の各要素を順次巡回してスタックに入れ、得られた要素が演算子である場合、スタックの上部の2つの要素を取り出して演算し、リストの巡回が完了するまで演算結果をスタックに入れます.
コードは次のとおりです.
import java.util.*;
public class MyStackCalculators {
public static void main(String[] args) {
String string = "(7+4*3+10*(3-3+4-1-8-10))";
List inputList = strToList(string);
List postfix = getPostfixExpression(inputList);
String res = getRes(postfix);
System.out.println(" :" + res);
}
/**
* , list 。
* @param expression
* @return
*/
private static List strToList(String expression) {
List arrayList = new ArrayList();
char ch[] = expression.toCharArray();
String v = "";
for(int i=0; i= '0' && e <= '9') {
v += e;
} else {
if(v != "") {
arrayList.add(v);
}
arrayList.add(e + "");
v = "";
}
}
if(v != "") {
arrayList.add(v);
}
return arrayList;
}
private static List getPostfixExpression(List list) {
List pfixExpList = new ArrayList<>();// list
Stack stack = new Stack<>();//
for(int i=0; i list) {
Stack stack = new Stack();//
for(int i=0; i
実行結果は次のとおりです. :-131
注意:このコードについてもう一つの問題は、式に乗算と除算が連続している場合、その出現順に計算され、1/3*3が0になる場合です.