Discuss / Java / 第二问

第二问

Topic source

dx

#1 Created at ... [Delete] [Delete and Lock User]

package aaaaa;

import java.util.*;

public class zbianh {

    public static void main(String[] args) {

        String exp = "x + 2 * ( y - 5 )";

        SuffixExpression se = compile(exp);

        System.out.println(se.dayin());

        Map<String, Integer> env = Map.of("x", 1, "y", 9);

        int result = se.execute(env);

        System.out.println(exp + " = " + result + " " + (result == 1 + 2 * (9 - 5) ? "✓" : "✗"));

    }

    static int getPriority(char temp) {

        int prior = 0;

        switch(temp) {

        case '+' : prior =0;

        break;

        case '-' : prior = 0;

        break;

        case '*' : prior =1;

        break;

        case '/' : prior = 1;

        break;

        case '(' : prior = 2;

        break;

        case ')' : prior = 2;

        break;

        default:

        }

        return prior;

    }

    static SuffixExpression compile(String exp) {

        // TODO:

        //1.定义优先级

        //2.设定栈

        Deque<Character> stack = new LinkedList<>();

        StringBuilder result = new StringBuilder();

        int size = exp.length();

        System.out.println(size);

        for(int i =0;i<size;i++) {

            System.out.println(result.toString());

            char temp = (char)exp.charAt(i);

            if(temp ==' ') {

                continue;

            }

            if(Character.isLetter(temp)||Character.isDigit(temp)) {

                result.append(temp);

            }

            else {

                if(temp ==')') {//要是把)设置为

                    while(stack.peek()!='(') {

                        result.append(stack.pop());

                    }

                    stack.pop();

                }

                else {

                    int prior = getPriority(temp);

                    while(true) {

                        //如果栈空,那么这个符号先 放入

                        if(stack.peek()==null) {

                            stack.push(temp);

                            break;

                        }

                    else {

                        if(getPriority(stack.peek())>=prior && stack.peek()!='(') {

                            result.append(stack.pop());

                        }

                        else {

                            stack.push(temp);

                            break;

                        }

                    }

                }

                }

            }

        }

        //处理完入栈的操作,把栈清空

        while(stack.peek()!=null) {

            result.append(stack.pop());

        }

        return new SuffixExpression(result);

    }

}

class SuffixExpression {

    private StringBuilder exp1;

    SuffixExpression(StringBuilder exp){

        this.exp1 = exp;

    }

    public String dayin() {

        return exp1.toString();

    }

    int execute(Map<String, Integer> env) {

        // TODO:

        Deque<Integer> stacknumber = new LinkedList<>();

        Deque<Character> stackchar = new LinkedList<>();

        System.out.println(exp1.length());

        for(int n = 0;n<exp1.length();n++) {

            if(Character.isLetter(exp1.charAt(n))){

                Integer a = env.get(""+exp1.charAt(n));

                System.out.println(a.intValue());

                stacknumber.push(a);

            }

            else if(Character.isDigit(exp1.charAt(n))) {

                stacknumber.push(new Integer((int)exp1.charAt(n)-48));

            }

            else {

                stackchar.add(Character.valueOf(exp1.charAt(n)));

            }

        }

        int resulttemp = 0;

        while(stackchar.peek()!=null) {

            int temp1 = stacknumber.pop().intValue();

            System.out.println(temp1);

            int temp2 = stacknumber.pop().intValue();

            System.out.println(temp2);

            char temp = stackchar.remove();

            resulttemp=0;

            switch(temp) {

            case '+' : resulttemp = temp1 + temp2;break;

            case '-' : resulttemp = temp2 - temp1;break;

            case '*' : resulttemp = temp1 * temp2;break;

            case '/' : resulttemp = temp2 / temp1;break;

            default:

            }

            if(stacknumber.peek()!=null) {

                stacknumber.push(resulttemp);

            }

        }

        return resulttemp;

    }

}

dx

#2 Created at ... [Delete] [Delete and Lock User]

啊啊啊啊 写错了 这个才是最正确的

package aaaaa;

import java.util.*;

public class zbianh {

    public static void main(String[] args) {

        String exp = "x + 2 * ( y - 5 )";

        SuffixExpression se = compile(exp);

        System.out.println(se.dayin());

        Map<String, Integer> env = Map.of("x", 1, "y", 9);

        int result = se.execute(env);

        System.out.println(exp + " = " + result + " " + (result == 1 *+ 2 * (9 - 5) ? "✓" : "✗"));

    }

    static int getPriority(char temp) {

        int prior = 0;

        switch(temp) {

        case '+' : prior =0;

        break;

        case '-' : prior = 0;

        break;

        case '*' : prior =1;

        break;

        case '/' : prior = 1;

        break;

        case '(' : prior = 2;

        break;

        case ')' : prior = 2;

        break;

        default:

        }

        return prior;

    }

    static SuffixExpression compile(String exp) {

        // TODO:

        //1.定义优先级

        //2.设定栈

        Deque<Character> stack = new LinkedList<>();

        StringBuilder result = new StringBuilder();

        int size = exp.length();

        System.out.println(size);

        for(int i =0;i<size;i++) {

            System.out.println(result.toString());

            char temp = (char)exp.charAt(i);

            if(temp ==' ') {

                continue;

            }

            if(Character.isLetter(temp)||Character.isDigit(temp)) {

                result.append(temp);

            }

            else {

                if(temp ==')') {//要是把)设置为

                    while(stack.peek()!='(') {

                        result.append(stack.pop());

                    }

                    stack.pop();

                }

                else {

                    int prior = getPriority(temp);

                    while(true) {

                        //如果栈空,那么这个符号先 放入

                        if(stack.peek()==null) {

                            stack.push(temp);

                            break;

                        }

                    else {

                        if(getPriority(stack.peek())>=prior && stack.peek()!='(') {

                            result.append(stack.pop());

                        }

                        else {

                            stack.push(temp);

                            break;

                        }

                    }

                }

                }

            }

        }

        //处理完入栈的操作,把栈清空

        while(stack.peek()!=null) {

            result.append(stack.pop());

        }

        return new SuffixExpression(result);

    }

}

class SuffixExpression {

    private StringBuilder exp1;

    SuffixExpression(StringBuilder exp){

        this.exp1 = exp;

    }

    public String dayin() {

        return exp1.toString();

    }

    int execute(Map<String, Integer> env) {

        // TODO:

        Deque<Integer> stacknumber = new LinkedList<>();

        int result =0;

        for(int n = 0;n<exp1.length();n++) {

            if(Character.isLetter(exp1.charAt(n))){

                Integer a = env.get(""+exp1.charAt(n));

                System.out.println(a.intValue());

                stacknumber.push(a);

            }

            else if(Character.isDigit(exp1.charAt(n))) {

                stacknumber.push(new Integer((int)exp1.charAt(n)-48));

            }

            else {

                int temp1 = stacknumber.pop().intValue();

                System.out.println(temp1);

                int temp2 = stacknumber.pop().intValue();

                System.out.println(temp2);

                char temp = exp1.charAt(n);

                switch(temp) {

                case '+' : result = temp1 + temp2;break;

                case '-' : result = temp2 - temp1;break;

                case '*' : result = temp1 * temp2;break;

                case '/' : result = temp2 / temp1;break;

                default:

                }

                stacknumber.push(result);

            }

        }

        return stacknumber.pop().intValue();

    }

}


  • 1

Reply