这个表达式如何求值的文章写得很好:如何用栈求表达式的值?(超级详细) (biancheng.net) 通过后缀表达式求值计算出来了,(A(BC)DE(F(GH))JKL)这个计算法则可以看成是直接可用的后缀表达式,每一个“)”相当于是前面两个操作数的乘法运算符,用java通过了:
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
//         System.out.println(n);
        int[][] data = new int[n][2];
        int i = 0;
        while (in.hasNextInt()) {
            data[i][0] = in.nextInt();
            data[i][1] = in.nextInt();
//             System.out.println(data[i][0] + " " + data[i][1]);
            i = i + 1;
        }
        String expr = in.nextLine();
        while (in.hasNextLine()) {
           expr = in.nextLine();
        }
//         System.out.println(expr);
        char[] c = expr.toCharArray();
        Stack<Object> stack = new Stack();
        int sum = 0;
        for (char t : c) {
            if (t >= 'A' && t <= 'Z') {
                stack.push(data[t - 'A']);
            } else if (t == '(') {
                stack.push(t);
            } else {
                int[] b = (int[])stack.pop();
                int[] a = (int[])stack.pop();
                stack.pop();
                sum = sum + a[0] * a[1] * b[1];
                stack.push(new int[]{a[0], b[1]});
            }
        }
        System.out.println(sum);
    }
}