毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> java技术 >> 正文

java读写txt文件并且进行字符串操作代码 第2页

更新时间:2012-6-22:  来源:毕业论文
    public static void main(String[] args) {
        List<String> tokens;
        try {
            // 词法分析
            tokens = lex("+2*(-2+3*4)+-5");

            // 中缀转后缀
            tokens = toRpn(tokens);

            // 计算结果
            System.out.println(calcRpn(tokens));

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * 将输入串转换为操作符串
     *
     * @param sExpres
     * @return
     */
    public static List<String> lex(String sExpres) {
        List<String> tokens = new ArrayList<String>();

        // 将表达式分割成符号序列
        String sRegExp = "(((?<=^|\\(|\\+|-|\\*|/|%)(\\+|-))?\\d+(\\.\\d+)?)"
                + "|\\(|\\)|\\*|/|\\+|-";
        Pattern p = Pattern.compile(sRegExp);
        Matcher m = p.matcher(sExpres.replaceAll("\\s+", ""));
        while (m.find()) {
            tokens.add(m.group());
        }

        tokens.add("#");

        return tokens;
    }

    /**
     * 将中缀表单时转化为后缀表达式
     *
     * @param tokens
     * @return
     */
    public static List<String> toRpn(List<String> tokens) throws Exception {
        List<String> rpnList = new ArrayList<String>();
        Stack<String> optrStack = new Stack<String>();

        optrStack.add("^");
        for (String token : tokens) {
            if (token.matches("^(\\+|-)?\\d+(\\.\\d+)?$")) {
                rpnList.add(token);
            } else {
                outputOptr(token, optrStack, rpnList);
            }
        }

        if (!optrStack.isEmpty() && optrStack.lastElement().equals("#")) {
            return rpnList;
        } else {
            throw new Exception("后缀表达式转化错误!");
        }
    }

    /**
     * 计算后缀表达式的值
     *
     * @param rpnTokens
     * @return
     * @throws Exception
     */
    public static double calcRpn(List<String> rpnTokens) throws Exception {
        NumberFormat nf = NumberFormat.getInstance();
        Stack<Double> numStack = new Stack<Double>();

        for (String token : rpnTokens) {
            if (token.matches("^(\\+|-)?\\d+(.\\d+)?$")) {
                token = token.indexOf('+') == 0 ? token.substring(1) : token;

上一页  [1] [2] [3] 下一页

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。