表达式求值-中序表达式转换成后序表达式然后求值

/*表达式求值,先转换成后缀表达式,再计算。
//从中缀表达式中从左往右依次取出数据
//如遇到操作数,直接输出到后缀的队列里。
//如果遇到操作符(包括括号),这里再定义一个存放操作符的栈,则:
//i.如果操作符是'(',入栈
//ii.如果操作符是')',则把栈里的操作符依次出栈并插入到后缀序列后面,直到遇到')'.
//iii.如果操作符不是‘(’和‘)’,则:
//     (1). 如果操作符的优先级比top的优先级高,则入栈
//     (2).如果操作符优先级等于或小于top优先级,则将top出栈并插入到后缀序列后面,pop后,再比较栈顶元素的优先级,重复iii,直到把此操作符      插入,将此操作符入栈。
如果中序队列里的数据已经读取完毕,记录操作符的栈里,还有操作符的话,依次出栈插入到后缀序列的后面。
此时中缀就已经转换为后缀表达式。*/
//然后对后缀表达式从前到后扫描,遇到数据入栈,遇到操作符则弹出两个数字进行计算,然后将计算结果入栈,重复操作,当扫描完毕后,栈定的元素便是结果
import java.util.*;
public class Biaodashi1 {
    public static void main(String args[]){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            String str=in.nextLine();
            System.out.printf("%.0f\n",f2(str));
        }
    }
    public static double f2(String str){
        Stack<String> stack=new Stack<String>();
        Queue<String> queue=new LinkedList<String>();
        String str1[]=str.split(" ");
        for(int i=0;i<str1.length;i++){
            if(str1[i].compareTo("*")==0 || str1[i].compareTo("/")==0){
                while(stack.size()>0){
                    String temp2=stack.peek();
                    if(temp2.compareTo("*")==0 ||temp2.compareTo("/")==0){
                        queue.offer(stack.pop());
                    }else{
                        break;
                    }
                }
                stack.push(str1[i]);
            }else if(str1[i].compareTo("+")==0 || str1[i].compareTo("-")==0){
                while(stack.size()>0){
                    String temp2=stack.peek();
                    if(temp2.compareTo("*")==0 ||temp2.compareTo("/")==0 ||temp2.compareTo("+")==0 ||temp2.compareTo("-")==0){
                        queue.offer(stack.pop());
                    }else{
                        break;
                    }
                }
                stack.push(str1[i]);
            }else if(str1[i].compareTo("(")==0){
                stack.push(str1[i]);
            }else if(str1[i].compareTo(")")==0){
                String temp1=stack.pop();
                while(temp1.compareTo("(")!=0){
                    queue.offer(temp1);
                    temp1=stack.pop();
                }
            }else{
                queue.offer(str1[i]);
            }
        }
        while(stack.size()>0){
            queue.offer(stack.pop());
        }
        Stack<String> res=new Stack<String>();
        while(queue.size()>0){
            String temp3=queue.poll();
            if(temp3.compareTo("+")==0 || temp3.compareTo("-")==0 || temp3.compareTo("*")==0 || temp3.compareTo("/")==0){
                double num1=Double.parseDouble(res.pop());
                double num2=Double.parseDouble(res.pop());
                if(temp3.compareTo("+")==0){
                    res.push((num1+num2)+"");
                }else if(temp3.compareTo("-")==0){
                    res.push((num2-num1)+"");
                }else if(temp3.compareTo("*")==0){
                    res.push((num2*num1)+"");
                }else{
                    res.push((num2/num1)+"");
                }
            }else{
                res.push(temp3);
            }
        }
        return Double.parseDouble(res.pop());
    }
}

猜你喜欢

转载自blog.csdn.net/anhuibozhoushatu/article/details/83823948