java写中缀表达式转后缀表达式,并将转换后的结果输出

public class TestStack {

    //判断是否为操作符
    private static boolean isOperator(String oper){
        if(oper.equals("+") || oper.equals("-") || oper.equals("/") || oper.equals("*") || oper.equals("(") || oper.equals(")")){
            return true;
        }
        return false;

    }


    //计算操作符的优先级
    private static int priority(String s){
        switch (s){
            case "+" : return 1;
            case "-" : return 1;
            case "*" : return 2;
            case "/" : return 2;
            case "(" : return 3;
            case ")" : return 3;
            default : return 0;
        }

}

  

public static void bianli(List<String> list){
    Iterator iterator = list.iterator();
    while(iterator.hasNext()){
        String c = (String) iterator.next();
        System.out.print(c + " ");
    }
}
   //将中缀表达式转后缀表达式
 public static List<String> zhuanHuan(String[] data){
        List<String> list = new ArrayList<>();
        MyStack<String> fuHao = new MyStack<>();
        for(int i = 0;i < data.length;i++){
            if(isOperator(data[i])){
                //判断栈内是否为空,如果为空,直接进行存放
                if(fuHao.isEmpty()){
                    fuHao.push(data[i]);
                    continue;
                }else if("(".equals(data[i])){
                    fuHao.push(data[i]);
                    continue;
                }else if("(".equals(fuHao.peek()) && priority(fuHao.peek()) > priority(data[i]) ){  //如果准备进栈的符号小于栈顶的级别,并且栈顶的符号为'('
                    fuHao.push(data[i]);
                    continue;
                }else if(")".equals(data[i])){//如果准备进栈的符号为')'则从栈顶开始出栈
//                    List<Character> resultList = new ArrayList<>();
                    while(!"(".equals(fuHao.peek())){   //出栈直到下一个栈顶为'('
                        String c = fuHao.pop();
//                        resultList.add(c);
                        list.add(c);
                    }
                    /*
                    ListIterator<Character> iterator = resultList.listIterator(resultList.size());
                    while(iterator.hasPrevious()){
                        Character c = iterator.previous();
                        list.add(c);
                    }
                    */
                    fuHao.pop();    //之后将'('出栈
                    continue;

//                    符号的优先级大于栈顶符号的优先级,则将优先级高的输出,并将之后的数字先输出再输出符号
                }else if(priority(data[i]) > priority(fuHao.peek())){
                    String c1 = data[i];

                    //将准备入栈的后一个数字先输出
                    if(++i <= data.length - 1  && !isOperator(data[i])){
                        list.add(data[i]);
                    }
                    //入栈的优先级高则直接输出
                    list.add(c1);
                    continue;
                }else if(priority(data[i]) == priority(fuHao.peek())){
                    //入栈的时候判断前面是否有括号
                    Object[] characters = fuHao.getArr();
                    boolean temp = false;       //判断栈中是否有括号
                    for(int j = characters.length - 1;j >= 0;j--){
                        if("(".equals(characters[j])){
                            temp = true;
                        }
                    }
                    //有括号直接入栈
                    if(temp){
                        fuHao.push(data[i]);
                    }else {
                        //没有的话输出桟底的符号
                        list.add(fuHao.stackBottom());
                    }
                }
            }else{
                //数字的话直接输出
                list.add(data[i]);
                continue;
            }

        }
        list.add(fuHao.pop());
        bianli(list);

        return list;
    }
    //将转换后的表达式进行计算
public static void cal(String[] arr){
    Double sum = null;
    MyStack<Double> myStack = new MyStack<>();
    Pattern pattern = Pattern.compile("\\d+||(\\d+\\.\\d+)"); //使用正则表达式 匹配数字
    for(int i = 0;i < arr.length;i++){
        if ((pattern.matcher(arr[i])).matches()){   //如果匹配的是数字,则进栈
            myStack.push(Double.parseDouble(arr[i]));
        }else{
            Double d1 = myStack.pop();
            Double d2 = myStack.pop();
            sum = calSum(arr[i],d2,d1);
            myStack.push(sum);
        }
    }

    System.out.println("计算后的结果为:" + sum);

}

public static double calSum(String c,Double c1,Double c2){
    System.out.println("得到的表达式为:" + c1 + c + c2);
    Double sum;
    switch (c){
        case "+":
            sum = c1 + c2;
            break;
        case "-":
            sum = c1 - c2;
            break;
        case "*":
            sum = c1 * c2;
            break;
        case "/":
            sum = c1 / c2;
            break;
        default:sum=null;
    }
    return sum;
}
    //测试结果
    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        String input = s.next();
        String[] arr = input.split("");
        for(int i = 0;i < arr.length;i++){
            System.out.print(arr[i]  + ",");
        }
        List<String> list = zhuanHuan(input.split(""));
        String str = list.toString();
        String strr = str.substring(1,str.length() - 1);//去掉前后两个"[" "]"
        String[] str1 = strr.split(", ");
        cal(str1);
    }


public class MyStack<T> {

    private T arr[];
    private int top;

    public T[] getArr() {
        return arr;
    }

    public void setArr(T[] arr) {
        this.arr = arr;
    }

    public int getTop() {
        return top;
    }

    public void setTop(int top) {
        this.top = top;
    }

    public MyStack(){
        top = -1;
        arr = (T[])new Object[10];
    }

    public MyStack(int maxSize){
        top = -1;
        arr = (T[]) new Object[maxSize];
    }

    //入栈操作 指针下移动
    public void push(T value){
        arr[++top] = value;
    }

    //推出元素并删除,指针下移
    public T pop(){
        int j = 10 - top - 1;
        T t = arr[top];

        System.arraycopy(arr,top + 1,arr,top,1);

//        for(int i = 0;i < arr.length;i++){
//            System.out.print(arr[i] + " ");
//
//        }
//        System.out.println();
        --top;
        return t;
    }

    //返回栈顶元素
    public T peek(){
        return arr[top];
    }

    //判断栈是否为空
    public boolean isEmpty(){
        return top == -1;
    }

    //判断栈是否满
    public boolean isFool(){
        return top == arr.length - 1;
    }

    //输出桟底的元素
    public T stackBottom(){
        if (!isEmpty()){
            return arr[0];
        }
        return null;
    }

    public T[] returnStack(){
        return arr;
    }

    public T peek1(){
        return arr[top - 1];
    }


}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值