中缀表达式转后缀表达式java精确实现

来源:互联网 发布:centos编译安装php7.1 编辑:程序博客网 时间:2024/06/07 07:49
package cn.itcast.StackAndQuen;import java.util.ArrayList;import java.util.List;import java.util.Scanner;/** * Created by likailong on 2016/10/16. * 中缀表达式到后缀表达式 */public class MathCaculate {    public static void main(String [] args){         Scanner san=new Scanner(System.in);//键盘读入         List<Character> list=new ArrayList<>();//将中缀表达式变成后缀表达式用数组存储         String input = san.next();//得到输入的信息         char[] shuju = input.toCharArray();//输入的所有信息放入char数组里        int priority=0;//标记符号的的优先级         MyStack<Character>mystack=new MyStack<>();//符号优先级栈         MyStack<Integer>caculatestack=new MyStack<>();//计算后缀表达式栈        int special=0;         for(int i=0;i<shuju.length;i++){//达到键盘输入的每个数据             if(getPriority(shuju[i])!=0){//的到每个数据的优先级                     if(getPriority(shuju[i])>=priority&&getPriority(shuju[i])!=3){//如果得到的是个运算符 与栈顶优先级比较                         priority=getPriority(shuju[i]);//如果大于等于栈顶优先级 入栈 反之出栈                          mystack.push(shuju[i]);                     }else if((getPriority(shuju[i])==3&&priority!=3&&special!=3)||(getPriority(shuju[i])!=3&&priority==3&&special!=3)){                            special=getPriority(shuju[i]);//如果大于等于栈顶优先级 入栈 反之出栈                             mystack.push(shuju[i]);                     }                     else if(getPriority(shuju[i])==3&&special==3){                         //如果大于等于栈顶优先级 入栈 反之出栈                         while (!mystack.isEmpty()){//出栈操作                             char num=mystack.pop();                             list.add(num);                             System.out.print(num);                         }                     }                     else{                          while (!mystack.isEmpty()){//出栈操作                              char num=mystack.pop();                              list.add(num);                              System.out.print(num);                          }                         mystack.push(shuju[i]);                     }             }else{                 System.out.print(shuju[i]);//如果是数字直接输出 用数组接收                 list.add(shuju[i]);             }         }        while (!mystack.isEmpty()){            char fuhao=mystack.pop();            list.add(fuhao);            System.out.print(fuhao);        }        System.out.println();        for(int i=0;i<list.size();i++){//运算方法  把存在数组中的后缀表达式遍历            String nums=list.get(i).toString();//每个元素转换成字符串方便后面的Integer.parseInt(nums);            char num=list.get(i);            if(num=='('||num==')'){                list.remove(i);            }            if('0'<=num&&num<='9'){//字符串比较应该这么写               int numss=Integer.parseInt(nums);//字符串转数字                caculatestack.push(numss);//入栈            }else {                int shuju1=caculatestack.pop();//出栈                int shuju2=caculatestack.pop();                char caculate=list.get(i);                int numadd=0;                if(caculate=='+'){//判断数组中的运算符 执行相关操作                    numadd=shuju1+shuju2;                }else if(caculate=='-'){                    numadd= shuju2-shuju1;                }else if(caculate=='*'){                    numadd= shuju1*shuju2;                }else if(caculate=='/'){                    numadd=shuju1/shuju2;                }                caculatestack.push(numadd);            }        }        System.out.println(caculatestack.pop());//得到栈顶元素及就是答案    }    private static int getPriority(char shuju) {//的输入的每个字符的优先级           int priority=0;            char num=shuju;            if(0<=num&&num<=9){            }else {                switch (num){                    case '-':                    case '+':                       return priority=1;                    case '/':                    case '*':                        return priority=2;                    case '(':                    case ')':                        return priority=3;                    default:priority=0;                }            }        return priority;    }}

0 0
原创粉丝点击