日期:2014-05-20  浏览次数:20642 次

算符优先法 设计一个带()的计算器
这个问题 可能比较棘手!

能计算一个: 7+(8+2*2)/3-1=10;就好了

------解决方案--------------------
上面的代码有点小问题。。
Java code
import java.util.Stack;
public class Calcu{
    Stack <Integer>num;
    Stack <String>exp;
    String expression="7+(8+2*2)/3-1=";
    public Calcu(){
        num=new Stack<Integer>();
        exp=new Stack<String>();
    }
    public void calculate(){
        char t;
        int s;
        int len=expression.length();
        for(int i=0;i<len;i++){
            t=expression.charAt(i);
            switch(t){
            case '-':
            case '+':if(!exp.empty()&& !exp.peek().equals("(") && !exp.peek().equals(")")){
                s=compute(exp.pop());
                num.push(s);
            } exp.push(String.valueOf(t));
            break;
            case '/':
            case '*':
                if(!exp.empty()&& exp.peek().equals("/")){
                    s=compute(exp.pop());
                    num.push(s);
                }else if(!exp.empty() && exp.peek().equals("*")){
                    s=compute(exp.pop());
                    num.push(s);
                }
                exp.push(String.valueOf(t));break;
            case '(':exp.push(String.valueOf(t));break;
            case ')':{
                while(!exp.peek().equals("(")){
                    s=compute(exp.pop());
                    num.push(s);
                }
                exp.pop();
                break;
            }
            case '=':{
                while(!exp.empty()){
                    s=compute(exp.pop());
                    num.push(s);
                }
                System.out.println(num.pop());
                break;
            }
            default:num.push(t-48);
        }
    }
}
    private int compute(String exp){
        int n2=num.pop();
        int n1=num.pop();
        switch(exp.charAt(0)){
        case '+':return n1+n2;
        case '-':return n1-n2;
        case '*':return n1*n2;
        case '/':return n1/n2;
        }
        return -1;
    }
    public static void main(String args[]){
        Calcu c=new Calcu();
        c.calculate();
    }
}

------解决方案--------------------
给你逆波兰式算法.经过测试


package expression;
 
import java.io.*;
import java.util.*;
 
public class Expression {
private ArrayList expression = new ArrayList();// 存储中序表达式
 
private ArrayList right = new ArrayList();// 存储右序表达式
 
private String result;// 结果
 
// 依据输入信息创建对象,将数值与操作符放入ArrayList中
private Expression(String input) {
StringTokenizer st = new StringTokenizer(input, "+-*/()", true);
while (st.hasMoreElements()) {
expression.add(st.nextToken());
}
}
 
// 将中序表达式转换为右序表达式
private void toRight() {
Stacks aStack = new Stacks();
String operator;
int position = 0;
while (true) {
if (Calculate.isOperator((String) expression.get(position))) {
if (aStack.top == -1
|| ((String) expression.get(position)).equals("(")) {
aStack.push(expression.get(position));
} else {
if (((String) expression.get(position)).equals(")")) {
if (!((String) aStack.top()).equals("(")) {
operator = (String) aStack.pop();
right.add(operator);
}
} else {
if (Calculate.priority((String) expression