什么是后缀表达式?
说到后缀表达式 我们先说下中缀表达式吧,中缀表达式其实就是我们平常看到的表达式例如:12+(19-48+5/8)
那么后缀表达式呢? 顾名思义 运算符号在后面的表达式:12 19 48 - 5 8 / + +
也许刚看到这串字符会很懵圏 我们来下慢动作:
可以看到 中缀表达式转换成后缀表达式时
检索第一个 为数字 在后缀表达式中直接 添加
如果 为 运算符号 则在栈中 添加
如果为( 则在栈中添加
如果为) 则将( 调至栈顶 并弹出栈
如果栈中有2个 或多于两个运算符 则 比较 栈最上方的两个运算符的 优先级 将优先级大的 填到后缀表达式中 并弹出
后缀表达式的转换呢 大概就是这样 主要运用了栈的知识
小白我呢 也不知道该怎么运用这些知识点所以 用ArrayList 来存储 模拟栈
不是全部的代码=。= 写的有些乱
private ArrayList Conversion(ArrayList arrayList) {
//mSuffix 结果
mSuffix = new ArrayList();
//运算符
mOperation = new ArrayList();
j = 0;
for (int i = 0; i < arrayList.size(); i++) {
if (arrayList.get(i) == "+" || arrayList.get(i) == "-") {
mOperation.add((String) arrayList.get(i));
getFirst();
} else if (arrayList.get(i) == "*" || arrayList.get(i) == "/") {
mOperation.add((String) arrayList.get(i));
getFirst();
} else if (arrayList.get(i) == "(") {
mOperation.add((String) arrayList.get(i));
j =1;
} else if (arrayList.get(i) == ")") {
j =0;
if (mOperation.size()>=1&&mOperation.get(mOperation.size()-1) == "("){
mOperation.remove(mOperation.size()-1);
}
if (mOperation.size() >= 2) {
if (mOperation.get(mOperation.size() - 2) == "(") {
mSuffix.add(mOperation.get(mOperation.size() - 1));
mOperation.remove(mOperation.size() - 1);
mOperation.remove(mOperation.size() - 1);
} else {
getFirst();
if (mOperation.get(mOperation.size() - 2) == "(") {
mSuffix.add(mOperation.get(mOperation.size() - 1));
mOperation.remove(mOperation.size() - 1);
mOperation.remove(mOperation.size() - 1);
}
}
}
} else {
mSuffix.add((String) arrayList.get(i));
}
if (i == arrayList.size() - 1) {
if (mOperation.size()>0){
getLast();
}
}
}
return mSuffix;
}
嗯 中缀转换成了后缀表达式以后呢 反正不能看着吧 在看下如何计算的
其实计算就比较容易了 简单的说也就一句话“检索到运算符的时候计算运算符前的2个数”
举个栗子:12 19 48 - 5 8 / + +
一个数一个数的读取 如下图
代码呢 如下:
public String Calculation(ArrayList<String> arrayList) {
String jieguo;
for (int i = 0; i <arrayList.size(); i++) {
if (arrayList.get(i) == "+") {
jieguo = MyMath.add(arrayList.get(i - 2), arrayList.get(i - 1));
arrayList.remove(i);
arrayList.remove(i - 1);
arrayList.remove(i - 2);
i = i - 2;
arrayList.add(i, jieguo);
// Calculation(changeString(result),changeString(result).size());
} else if (arrayList.get(i) == "-") {
jieguo = MyMath.subtract(arrayList.get(i - 2), arrayList.get(i - 1));
arrayList.remove(i);
arrayList.remove(i - 1);
arrayList.remove(i - 2);
i = i - 2;
arrayList.add(i, jieguo);
// Calculation(changeString(result),changeString(result).size());
} else if (arrayList.get(i)== "*") {
jieguo = MyMath.multiply(arrayList.get(i - 2), arrayList.get(i - 1));
arrayList.remove(i);
arrayList.remove(i - 1);
arrayList.remove(i - 2);
i = i - 2;
arrayList.add(i, jieguo);
// Calculation(changeString(result),changeString(result).size());
} else if (arrayList.get(i) == "/") {
if (arrayList.get(i - 1).equals("0")) {
return "除零了";
} else {
jieguo = MyMath.divide(arrayList.get(i - 2), arrayList.get(i - 1));
arrayList.remove(i);
arrayList.remove(i - 1);
arrayList.remove(i - 2);
i = i - 2;
arrayList.add(i, jieguo);
}
}
}
return arrayList.get(0);
}
唔 算是第一次写博客吧·· 哈哈这里小白 从零开始系列