当前位置: 代码迷 >> J2SE >> 读写txt资料并且进行字符串操作。
  详细解决方案

读写txt资料并且进行字符串操作。

热度:7   发布时间:2016-04-24 00:44:02.0
读写txt文件并且进行字符串操作。。。

  input.txt如下:  
  5*6+3
  2*(3+2-1)
  ……
 
   
  要求如下:
  1. 从input.txt文件,读取每一行的数据并计算出结果输出。
  2. 输出格式如下:
  5*6+3=33
  2*(3+2-1)=8
  ……  

  涉及到的考点:
  文件操作
  字符串操作
  数据结构栈或者二叉树的运用

我想了很久没有做出来。。。求大神帮帮我啊

------解决方案--------------------
从文件读取很简单。我就不给你写了
Java code
//计算代码//相当于一个表达式解析器import java.text.NumberFormat;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Stack;import java.util.regex.Matcher;import java.util.regex.Pattern;public class ExpressionParser {    static Map<String, Integer> optrOrder;    static {        init();    }    private static void init() {        optrOrder = new HashMap<String, Integer>();        optrOrder.put("(", 0);        optrOrder.put("*", 1);        optrOrder.put("/", 1);        optrOrder.put("%", 1);        optrOrder.put("+", 2);        optrOrder.put("-", 2);        optrOrder.put("^", 3);        optrOrder.put("#", 3);    }    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;                numStack.add(nf.parse(token).doubleValue());            } else {                doCalcByOptr(token, numStack);            }        }        if (!numStack.isEmpty() && numStack.size() == 1) {            return numStack.lastElement();        } else {            throw new Exception("计算错误!");        }    }    /**     * 将运算符输出到后缀表达式序列.     *      * @param optr     * @param optrStack     * @param rpnList     * @throws Exception     */    public static void outputOptr(String optr, Stack<String> optrStack,            List<String> rpnList) throws Exception {        String preOptr;        if (optr.equals("(")) {// 处理左括号            optrStack.push(optr);            return;        }        if (optr.equals(")")) {// 处理右括号            while (!optrStack.isEmpty()) {                preOptr = optrStack.pop();                if (!preOptr.equals("(")) {                    rpnList.add(preOptr);                } else {                    break;                }            }            if (optrStack.isEmpty()) {                throw new Exception("括号未闭合!");            }            return;        }        /*         * 按优先级处理其他运算符,若当前运算符优先级较高 直接入栈, 否则将栈中运算符出战直至栈顶运算符 低于当前运算符         */        preOptr = optrStack.lastElement();        if (optrCmp(optr, preOptr) < 0) {            optrStack.push(optr);        } else {            while (!preOptr.equals("(") && !optrStack.isEmpty()                    && optrCmp(optr, preOptr) >= 0) {                preOptr = optrStack.pop();                if (!preOptr.equals("^")) {                    rpnList.add(preOptr);                }            }            optrStack.push(optr);        }    }    /**     * 运算符优先级比较函数,optr1优先级大于optr2返回小于0值, 优先级相等返回0,optr1小于optr2返回大于0值.     *      * @param optr1     * @param optr2     * @return     */    public static int optrCmp(String optr1, String optr2) {        int order1 = optrOrder.get(optr1);        int order2 = optrOrder.get(optr2);        return order1 - order2;    }    /**     * 根据运算符对数据栈中的内容进行操作.     *      * @param optr     * @param numStack     */    public static void doCalcByOptr(String optr, Stack<Double> numStack) {        double n1, n2;        n2 = numStack.pop();        n1 = numStack.pop();        if (optr.equals("+")) {            numStack.push(n1 + n2);        } else if (optr.equals("-")) {            numStack.push(n1 - n2);        } else if (optr.equals("*")) {            numStack.push(n1 * n2);        } else if (optr.equals("/")) {            numStack.push(n1 / n2);        } else if (optr.equals("%")) {            numStack.push(n1 % n2);        }    }}
  相关解决方案