package expression;
public class calculate{
public static boolean isoperator(string operator){
if(operator.equals("+")||operator.equals("-")||operator.equals("*")||operator.equals("/")||operator.equals("(")||operator.equals(")")) return true;
else return false;
}
public static int priority(string operator){
if(operator.equals("+")||operator.equals("-")||operator.equals("(")) return 1;
else if(operator.equals("*")||operator.equals("/")) return 2;
else return 0;
}
public static string tworesult(string operator,string a,string b){
try{
string op=operator;
string rs=new string();
double x=double.parsedouble(b);
double y=double.parsedouble(a);
double z=0;
if(op.equals("+")) z=x+y;
else if(op.equals("-")) z=x-y;
else if(op.equals("*")) z=x*y;
else if(op.equals("/")) z=x/y;
else z=0;
return rs+z;
}
catch(numberformatexception e){
system.out.println("input has something wrong!");
return "error";
}
}
}
package expression;
import java.util.*;
public class stacks{
private linkedlist list=new linkedlist();
int top=-1;
public void push(object value){
top++;
list.addfirst(value);
}
public object pop(){
object temp=list.getfirst();
top--;
list.removefirst();
return temp;
}
public object top(){
return list.getfirst();
}
}
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.get(position))<=calculate.priority((string)astack.top())&&astack.top!=-1){
operator=(string)astack.pop();
if(!operator.equals("(")) right.add(operator);
}
astack.push(expression.get(position));
}
}
}
else right.add(expression.get(position));
position++;
if(position>=expression.size()) break;
}
while(astack.top!=-1){
operator=(string)astack.pop();
right.add(operator);
}
}
//对右序表达式进行求值
private void getresult(){
this.toright();
stacks astack=new stacks();
string op1,op2,is=null;
iterator it=right.iterator();
while(it.hasnext()){
is=(string)it.next();
if(calculate.isoperator(is)){
op1=(string)astack.pop();
op2=(string)astack.pop();
astack.push(calculate.tworesult(is,op1,op2));
}
else astack.push(is);
}
result=(string)astack.pop();
it=expression.iterator();
while(it.hasnext()){
system.out.print((string)it.next());
}
system.out.println("="+result);
}
public static void main(string avg[]){
try{
system.out.println("input a expression:");
bufferedreader is=new bufferedreader(new inputstreamreader(system.in));
for(;;){
string input=new string();
input=is.readline().trim();
if(input.equals("q")) break;
else{
expression boya=new expression(input);
boya.getresult();
}
system.out.println("input another expression or input 'q' to quit:");
}
is.close();
}
catch(ioexception e){
system.out.println("wrong input!!!");
}
}
}
闽公网安备 35060202000074号