表达式求值

来源:互联网 发布:站长站源码 编辑:程序博客网 时间:2024/06/06 03:30

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=8


本题主要是对栈的运用,摘自网友的程序


import java.text.DecimalFormat;import java.util.Scanner;import java.util.Stack;public class Main {    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        DecimalFormat d = new DecimalFormat(".00");        int num = sc.nextInt();        for (int i = 0; i < num; ++i) {            String s = sc.next();            s = s.substring(0, s.length() - 1);            System.out.println(d.format(f(s)));        }        sc.close();    }    private static double f(String s) {        Stack<Double> data = new Stack<Double>();        Stack<Character> chara = new Stack<Character>();        StringBuilder sb = new StringBuilder();        boolean hasNum = false;        for (int i = 0; i < s.length(); ++i) {            char ch = s.charAt(i);            if ((ch == '.') || ((ch >= '0') && (ch <= '9'))) {                hasNum = true;                sb.append(ch);                continue;            }            if (hasNum) {                hasNum = false;                data.push(Double.valueOf(sb.toString()));                sb = new StringBuilder();            }            if (chara.isEmpty()) {                chara.push(ch);                continue;            }            if (level(chara.peek()) == 4) {                if (level(ch) == 1) {                    chara.pop();                } else {                    chara.push(ch);                }            } else if (level(chara.peek()) >= level(ch)) {                data.add(g(data.pop(), data.pop(), chara.pop()));                --i;            } else {                chara.push(ch);            }        }        if (!sb.toString().equals("")) {            data.push(Double.valueOf(sb.toString()));        }        while (!chara.isEmpty())            data.add(g(data.pop(), data.pop(), chara.pop()));        return data.pop();    }    private static int level(char ch) {        int result = 0;        switch (ch) {        case '(':            result = 4;            break;        case '*':            result = 3;            break;        case '/':            result = 3;            break;        case '+':            result = 2;            break;        case '-':            result = 2;            break;        case ')':            result = 1;        }        return result;    }    private static double g(double b, double a, char ch) {        double result = 0;        switch (ch) {        case '+':            result = a + b;            break;        case '-':            result = a - b;            break;        case '*':            result = a * b;            break;        case '/':            result = a / b;        }        return result;    }}


0 0
原创粉丝点击