简易Java控制台计算器

来源:互联网 发布:张德芬哪本书最好知乎 编辑:程序博客网 时间:2024/05/23 19:12

简易Java控制台计算器

源码清单:

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!!!");     

        }
     

    }
     

}
     

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;     

    }
     

    

    
// 做2值之间的计算     

    
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";     

        }
     

    }
     

}
    

//栈类      

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();      

   }
      

}