- 后缀表达式是没有括号的表达式,例如 a+b*c+d 为a b c * + d +(这个可以看做将b和c相乘后所得到的值转化为a1然后将a1与a 相加得到a2然后将a2与d 相加得到a3)。
- 因为计算机的读取规则是从左往右读取,所以对后缀表达式的计算可以用栈来进行。
-
计算步骤如下:
- 当遇到操作符时直接压入栈中,如果遇到运算符时就从栈中弹出两个元素进行运算之后在把得到的值放入栈中,这里注意要将先弹出来的那个数作为运算符右边的数来进行运算,为了防止运算顺序颠倒,因为先压入栈中的数为前面表达式先计算出来的值,我们要按照从左到右的基本顺序。
- 最后当表达式遍历完时,这时留在栈里面的数就是为最终计算出来的值,此时弹出来就可以得到对应的值。
- 比如中缀表达式4*(6-2)-7-5*4转化为后缀表达式为4 6 2 - * 7 - 5 4 * - 。后缀表达式的过程为如图。
代码如下为:
package com.ranyu.tree;
import java.util.Stack;
/**
* @version 1.0
* @Author ran_yu
* @Date 2023/01/27 23:32
* 实现后缀表达式
**/
public class laterSymbol {
/**
* 计算后缀表达式的值
* @param Symbol
* @return
*/
public static double calculation(String Symbol){
String[] single = Symbol.split(" ");//以一个空格分隔来表示
Stack<String> stock = new Stack<>();//创建一个用于存储计算的栈
double data1=0.0;
double data2=0.0;
for (int i = 0; i < single.length; i++) {//进行全部遍历一遍
if(isOperate(single[i])){//如果为运算符,就进行栈的弹出与计算
data2=Double.parseDouble(stock.pop());//将字符串类型的转化为double 类型的。
data1=Double.parseDouble(stock.pop());
stock.push(String.valueOf(smallCalculation(single[i],data1,data2)));//计算后在进行压入
}else {//如果不为运算符就直接压入
stock.push(single[i]);
}
}
//返回栈中最后留下的值,就是后缀表达式计算得来的值。
return Double.parseDouble(stock.pop());
}
/**
* 用于判断是否是运算符
* @param value
* @return
*/
private static boolean isOperate(String value){
return (value.equals("+")||value.equals("-")||value.equals("*")||value.equals("/"));
}
/**
* 用与计算从栈中弹出来的两个数的值的函数。
* @param operate
* @param data1
* @param data2
* @return
*/
private static double smallCalculation(String operate,double data1,double data2){
if(operate.equals("+")){
return data1+data2;
}else if(operate.equals("-")){
return data1-data2;
}else if(operate.equals("*")){
return data1*data2;
}else {
return data1/data2;
}
}
/**
* 进行测试
* @param args
*/
public static void main(String[] args) {
String operate="4 6 2 - * 7 - 5 4 * -";//这里用空格来进行分割。
double calculation = calculation(operate);
System.out.println("值为= "+calculation);
}
}