Java 从键盘输入一个只有加减法的等式,求结果

从键盘输入一个等式,例如1+1-1,输出最后的答案1,输入的等式不确定项数

 /* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String s = "12+3-5-1";
        char op = '\0';
        int num1 = 0, num2 = 0;
        s+="+";
        for (int i = 0; i < s.length(); i++)
        {
            if (s.charAt(i) >= '0' && s.charAt(i) <= '9')
            {
                if (op == '\0')
                {
                    num1 = num1 * 10 + (int)(s.charAt(i) - '0');
                }
                else
                {
                    num2 = num2 * 10 + (int)(s.charAt(i) - '0');
                }
            }
            if (s.charAt(i) == '+' || s.charAt(i) == '-')
            {
                if (op == '\0')
                {
                    op = s.charAt(i);
                }
                else
                {
                    if (op == '+')
                        num1 = num1 + num2;
                    else
                        num1 = num1 - num2;
                    num2 = 0;
                    op = s.charAt(i);
                }
            }
        }
        System.out.println(num1);
    }
}

http://ideone.com/GGNHkR
输出 9

package test;

import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;

public class Test3 {

public ArrayList<String> getStringList(String str) {
    ArrayList<String> result = new ArrayList<String>();
    String num = "";
    for (int i = 0; i < str.length(); i++) {
        if (Character.isDigit(str.charAt(i))) {
            num = num + str.charAt(i);
        } else {
            if (num != "") {
                result.add(num);
            }
            result.add(str.charAt(i) + "");
            num = "";
        }
    }
    if (num != "") {
        result.add(num);
    }
    return result;
}

/**
 * 将中缀表达式转化为后缀表达式
 * 
 * @param inOrderList
 * @return
 */
public ArrayList<String> getPostOrder(ArrayList<String> inOrderList) {

    ArrayList<String> result = new ArrayList<String>();
    Stack<String> stack = new Stack<String>();
    for (int i = 0; i < inOrderList.size(); i++) {
        if (Character.isDigit(inOrderList.get(i).charAt(0))) {
            result.add(inOrderList.get(i));
        } else {
            switch (inOrderList.get(i).charAt(0)) {
            case '(':
                stack.push(inOrderList.get(i));
                break;
            case ')':
                while (!stack.peek().equals("(")) {
                    result.add(stack.pop());
                }
                stack.pop();
                break;
            default:
                while (!stack.isEmpty()
                        && compare(stack.peek(), inOrderList.get(i))) {
                    result.add(stack.pop());
                }
                stack.push(inOrderList.get(i));
                break;
            }
        }
    }
    while (!stack.isEmpty()) {
        result.add(stack.pop());
    }
    return result;
}

/**
 * 计算后缀表达式
 * 
 * @param postOrder
 * @return
 */
public Integer calculate(ArrayList<String> postOrder) {
    Stack stack = new Stack();
    for (int i = 0; i < postOrder.size(); i++) {
        if (Character.isDigit(postOrder.get(i).charAt(0))) {
            stack.push(Integer.parseInt(postOrder.get(i)));
        } else {
            Integer back = (Integer) stack.pop();
            Integer front = (Integer) stack.pop();
            Integer res = 0;
            switch (postOrder.get(i).charAt(0)) {
            case '+':
                res = front + back;
                break;
            case '-':
                res = front - back;
                break;
            case '*':
                res = front * back;
                break;
            case '/':
                res = front / back;
                break;
            }
            stack.push(res);
        }
    }
    return (Integer) stack.pop();
}

/**
 * 比较运算符等级
 * 
 * @param peek
 * @param cur
 * @return
 */
public static boolean compare(String peek, String cur) {
    if ("*".equals(peek)
            && ("/".equals(cur) || "*".equals(cur) || "+".equals(cur) || "-"
                    .equals(cur))) {
        return true;
    } else if ("/".equals(peek)
            && ("/".equals(cur) || "*".equals(cur) || "+".equals(cur) || "-"
                    .equals(cur))) {
        return true;
    } else if ("+".equals(peek) && ("+".equals(cur) || "-".equals(cur))) {
        return true;
    } else if ("-".equals(peek) && ("+".equals(cur) || "-".equals(cur))) {
        return true;
    }
    return false;
}

public static void main(String[] args) {
    Test3 calculate = new Test3();
    Scanner sc = new Scanner(System.in);
    String s = sc.nextLine();
    ArrayList result = calculate.getStringList(s); // String转换为List
    result = calculate.getPostOrder(result); // 中缀变后缀
    int i = calculate.calculate(result); // 计算
    System.out.println(i);

}

}

参考:http://blog.csdn.net/yhhazr/article/details/7947962