在我们小学的时候就应该已经学会了多项式的运算,在那个时候我们就已经知道四则运算准则“先乘除后加减,有括号线运算括号里面的”,那么对于计算机他又是怎么处理的呢?
正常情况下我们计算一个个多项式的结果所运用到的方法是中缀表达式,即“5+2*(3*(3-1*2+1))”,而计算机所能进行运算的是后缀表达式,即将上述我们所看到的多项式进行转换,转换成“523312*-1+**+”,比如像“12*”的运算结果是2,然后记录“52332-1+**+”,再次运算“32-”,结果为“1”,再次记录“52311+**+”,以此类推,实现代码如下:
package 栈与队列;
import java.util.Scanner;
import java.util.Stack;
/**
* @author Dracular
* @version $Rev$
* @des ${TODO}
* @date 2019/1/13 14:38
* @updateAuthor $Author$
* @updateDes ${TODO}
*/
public class PolishNotation {
public static Stack<Character> op = new Stack<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
String out = trans(s);
System.out.println(out); //打印出后缀表达式
float result = calc(out);
System.out.println(result);//打印出运算结果
}
/**
* 计算后缀表达式
*
* @param s 后缀表达式
* @return
*/
private static float calc(String s) {
Stack<Float> v = new Stack<>();
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
char ch = chars[i];
if (ch >= '0' && ch <= '9') {
v.push(Float.valueOf(ch - '0'));
} else {
v.push(getResult(ch, v.pop(), v.pop()));
}
}
return v.pop();
}
/**
* 得到结果
*
* @param op 运算符号
* @param f1 运算符号后面的数字
* @param f2 运算符号前面的数字
* @return
*/
private static Float getResult(char op, Float f1, Float f2) {
if (op == '+') {
return f2 + f1;
} else if (op == '*') {
return f2 * f1;
} else if (op == '-') {
return f2 - f1;
} else if (op == '/') {
return f2 / f1;
} else {
return Float.valueOf(-0);
}
}
/**
* 将中缀表达式转换为后缀表达式
*
* @param s 输入的中缀表达式
* @return
*/
private static String trans(String s) {
char[] arr = s.toCharArray();
int length = arr.length;
String out = "";
for (int i = 0; i < length; i++) {
char ch = arr[i];
if (ch == ' ') {
continue;
}
if (ch >= '0' && ch <= '9') {
out += ch;
}
if (ch == '(') {
op.push(ch);
}
if (ch == '+' || ch == '-') {
while (!op.empty() && op.peek() != '(') {
out += op.pop();
}
op.push(ch);
}
if (ch == '*' || ch == '/') {
while (!op.empty() && (op.peek() == '*' || op.peek() == '/')) {
out += op.pop();
}
op.push(ch);
}
if (ch == ')') {
while (!op.empty() && op.peek() != '(') {
out += op.pop();
}
op.pop();
}
}
while (!op.empty()) {
out+=op.pop();
}
return out;
}
}
输入:5+2*(3*(3-1*2+1))
输出:523312*-1+**+
17.0