二十四点--ccf(100分)

import java.util.LinkedList;
import java.util.Scanner;

/**
 * @author 
 */
public class ReversePolish {
    /**
      存储运算数的栈
    **
    /
    private LinkedList<Integer> operandStack  = new LinkedList<>();
    /**
    存储运算符的栈
    **/
    private LinkedList<Character> operatorStack  = new LinkedList<>();
    private static final char END = '#';
    private void reversePolish(){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        String compression;
        operatorStack.push(END);
        scanner.nextLine();
        for (int i = 0; i < n; i++) {
            int sum;
            compression = scanner.nextLine();
            for (int j = 0; j < compression.length(); j++) {
                switch (compression.charAt(j)){
                    case '+':if(operatorStack.getFirst() == END){
                        operatorStack.push('+');
                    }else{
                        sum = calculate(operatorStack.pop());
                        operatorStack.push('+');
                        operandStack.push(sum);
                    }break;
                    case '-':if(operatorStack.getFirst() == END){
                        operatorStack.push('-');
                    }else{
                        sum = calculate(operatorStack.pop());
                        operatorStack.push('-');
                        operandStack.push(sum);

                    }break;
                    case 'x':if(operatorStack.getFirst() == END || operatorStack.getFirst() == '+' || operatorStack.getFirst() == '-'){
                        operatorStack.push('x');
                    }else{
                        sum = calculate(operatorStack.pop());
                        operatorStack.push('x');
                        operandStack.push(sum);
                    }break;
                    case '/':if(operatorStack.getFirst() == END || operatorStack.getFirst() == '+' || operatorStack.getFirst() == '-'){
                        operatorStack.push('/');
                    }else{
                        sum = calculate(operatorStack.pop());
                        operatorStack.push('/');
                        operandStack.push(sum);
                    }break;
                    default:operandStack.push(Integer.parseInt(String.valueOf(compression.charAt(j))));
                }
            }
            while (operatorStack.getFirst() != END){
                sum = calculate(operatorStack.pop());
                operandStack.push(sum);
            }
            if(operandStack.pop() == 24){
                System.out.println("Yes");
            }else {
                System.out.println("No");
            }
        }
    }
    private int calculate(char operator){
        int op1 = operandStack.pop();
        int op2 = operandStack.pop();
        switch (operator){
            case '+':return op2 + op1;
            case '-':return op2 - op1;
            case 'x':return op2 * op1;
            // 除法
            default :return op2 / op1;
        }
    }

    public static void main(String[] args) {
        new ReversePolish().reversePolish();
    }
}

思路:其实就是一个正常算术表达式转换为逆波兰式的过程。需要一个运算数栈和一个运算符栈。对逆波兰式不熟悉的可以先看一下逆波兰式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值