问题如下:我写的只能得到30分,求大神指点!我的代码如下:import java.util.Scanner;public class 二十四点 {
    public static void main(String[] args) {
        Scanner s =  new Scanner(System.in);
        int n = s.nextInt();
        String strs[] = new String[n];
        for(int i = 0;i < n;i++) {
            strs[i] = s.next();
        }
        for (int j = 0; j < n;j++){
            if(calc(strs[j]) == 24){
                System.out.println("Yes");
            }else {
                System.out.println("No");
            }
        }
        }
        public static  int calc(String str){
            int res = 0;
            char chars[] = str.toCharArray();
            //中缀表达式转后缀表达式
            Stack stack = new Stack(10);
            String postfix = "";
            for (int i=0;i<chars.length;i++){
                if (chars[i] > '9' || chars[i] < '0'){   //只要不是数字必定是操作符  操作符要出栈到“小于”当前操作符优先级
                    while (stack.peek()=='x' || stack.peek()=='/'){
                        postfix +=stack.pop();
                    }
                    stack.push(chars[i]);
                }
                else{
                    postfix += chars[i];
                }
            }
            while (!stack.isEmpty()){
                    postfix += stack.pop();
                }
            //计算后缀表达式
            Stack calcStack = new Stack(10);
            char postfixs[] = postfix.toCharArray();
            for (int i = 0; i < postfixs.length ; i++){
                if (postfixs[i] >= '0' && postfixs[i] <= '9'){
                    calcStack.push(postfixs[i]);
                }else{
                    int right = 0;
                    switch (postfixs[i]){
                        case 'x':
                            res =(calcStack.pop()-'0') * (calcStack.pop()-'0');
                            calcStack.push((char)((int)'0'+res));
                            break;
                        case '/':
                            right = calcStack.pop()-'0';
                            res =((calcStack.pop()-'0') / right);
                            calcStack.push((char)((int)'0'+res));
                            break;
                        case '+':
                            res =(calcStack.pop()-'0' )+ (calcStack.pop()-'0');
                            calcStack.push((char)((int)'0'+res));
                            break;
                        case '-':
                            right = calcStack.pop()-'0';
                            res = (calcStack.pop()-'0') - right;
                            calcStack.push((char)((int)'0'+res));
                            break;
                    }
                }
            }
            res = calcStack.pop() - '0';
            return res;
        }
    }
class Stack{
    private int maxSize;
    private char stackArray[];
    private int top;
    public Stack(int max){
        maxSize = max;
        stackArray = new char[max];
        top = -1;
    }
    public char pop() {
        return stackArray[top--];
    }
    public void push(char x){
        stackArray[++top] = x;
    }
    public char peek(){
        if (top != -1)
            return stackArray[top];
        else
            return  ' ';
    }
    public boolean isEmpty(){
        return top==-1;
    }
}

解决方案 »

  1.   


    你这个也叫能通过?我在你calc方法里加了个打印字符串postfix,你看看你的运行结果
    1
    9+3+4X3
    9343X++
    No
    明显应该是Yes 
      

  2.   


    你这个也叫能通过?我在你calc方法里加了个打印字符串postfix,你看看你的运行结果
    1
    9+3+4X3
    9343X++
    No
    明显应该是Yes  
    题目里用的是 ‘x’ 不是 ‘X’ ,我没对'X'做判断,用‘x’转换出来的是正确的。
      

  3.   

    用 Expression 和 Expression.eval方法
      

  4.   

    字符串位置相对都是固定的,你第一步分离根本没必要,数字就是char数组的0,2,4,6 ;符号就是1,3,5