当前位置: 代码迷 >> J2SE >> 算符优先法 设计一个带()的计算器解决方法
  详细解决方案

算符优先法 设计一个带()的计算器解决方法

热度:100   发布时间:2016-04-24 13:02:02.0
算符优先法 设计一个带()的计算器
这个问题 可能比较棘手!

能计算一个: 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
  相关解决方案