《JAVA数据结构》----逆波兰表达式的运算

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/*
前缀表达式:(3+4)*5-6------》-*+3456。从右到左依次扫描,以6543的顺序入栈,此时栈顶元素为3,次顶元素为4。当扫描至运算符“+”时,此时数栈中弹出3和4,
       3和4相加为7,此时再将7入数栈,此时栈中的元素为756,栈顶元素为7,接着扫描元素到操作符*,运算7*5,把运算结果35在压入数栈,此时栈中元素为35 6
       而后接着扫描元素到-,运算35-6,得到结果为29.
中缀表达式:人最为熟悉的表达式------》(3+4)x5-6---对于计算机并不好操作
后缀表达式:运算符位于操作数的后面------》(3+4)x5-6------》34+5x6-
           从左至右扫描表达式,将34依次压入数栈,接着扫描遇到操作符+,此时再从数栈中弹出43(4为栈顶元素,3为栈底元素)计算4+3得7,然后将7压入数栈,
           此时栈中只有元素7,而后继续扫描,将5压入数栈,此时栈中元素为75(5为栈顶元素,7为次顶元素),继续扫描至操作符x,接着从数栈中弹出7和5,
           计算7*5=35,继续将35压入。此时栈中只有元素35,而后继续将6压入数栈,此时栈中元素为35 6(6为栈顶元素,35为次顶元素),扫描至最后一个操作符-时,
           从数栈中弹出35和6,计算35-6=29,
           出栈的顺序决定数字的运算位置,前面的是次顶元素,后面的是栈顶元素。
 */
//逆波兰计算器的完成--------》后缀表达式的实现---》只支持对整数的计算
public class TsetStack02 {
    public static void main(String[] args) {
        //先定义一个逆波兰表达式,数字和符号之间用空格隔开
        String expression = "3 24 + 53 * 6 -";
        List testlist=getListString(expression);
        System.out.println(testlist);
        int res=Calculator(testlist);
        System.out.println(res);
        //思路
        /*
        1.先将expression放到一个Arrayslist中
        2.将Arrayslist传递给一个方法,遍历ArrayList配合栈完成计算
         */
        //将逆波兰表达式顺序放入一个ArraysList中
    }
        public static List getListString(String expression){
        //将expression分割
            String[] split=expression.split(" ");
            List list=new ArrayList();
            for(String ele:split){
                list.add(ele);
            }
            return list;

    }
    //完成对逆波兰表达式的计算
    public static int Calculator(List list){
        //创建一个栈,只需要一个栈即可
        Stack stack=new Stack<>();
        //从list中取出元素
        for (String item:list){
            if(item.matches("\\d+")) {//正则表达式表示多位数
                stack.push(item);
            }else {
                //pop出两个数。并运算
                int num2=Integer.parseInt(stack.pop());
                int num1=Integer.parseInt(stack.pop());
                int res=0;//存放计算结果
                if(item.equals("+")){
                    res=num1+num2;
                }else if (item.equals("-")){
                    res=num1-num2;
                }else if(item.equals("*")){
                    res=num1*num2;
                }else if(item.equals("/")){
                    res=num1/num2;
                }else{
                    throw new RuntimeException("运算符有误");
                }
                //把res入栈
                stack.push(""+res);//把整数转换为字符串
         }
        }
        return Integer.parseInt(stack.pop());

    }
}

你可能感兴趣的:(java,数据结构,开发语言)