cavenaghi

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            4 Posts :: 0 Stories :: 3 Comments :: 0 Trackbacks

          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();//存儲中序表達(dá)式
           private ArrayList right=new ArrayList();//存儲右序表達(dá)式
           private String result;//結(jié)果
           //依據(jù)輸入信息創(chuàng)建對象,將數(shù)值與操作符放入ArrayList中
           private Expression(String input){
            StringTokenizer st=new StringTokenizer(input,"+-*/()",true);
            while(st.hasMoreElements()){
             expression.add(st.nextToken());
            }
           }
           //將中序表達(dá)式轉(zhuǎn)換為右序表達(dá)式
           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);
            }
           }
           //對右序表達(dá)式進(jìn)行求值
           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!!!");
            }
           }
          }

          posted on 2005-07-27 11:45 Cavenaghi 閱讀(1010) 評論(1)  編輯  收藏

          Feedback

          # re: 數(shù)據(jù)結(jié)構(gòu)JAVA示例---逆波蘭式求值! 2005-07-27 17:36 蘑菇
          問個(gè)弱弱的問題:“逆波蘭式求值”是啥米東西?  回復(fù)  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 高平市| 含山县| 马山县| 麟游县| 长葛市| 海晏县| 岳普湖县| 会泽县| 宝兴县| 拜城县| 林周县| 连平县| 汝南县| 长海县| 渭南市| 柳河县| 高平市| 慈利县| 广灵县| 嘉兴市| 武鸣县| 渭源县| 龙南县| 乌兰县| 甘南县| 泌阳县| 台山市| 峨边| 北安市| 靖江市| 淄博市| 安陆市| 祁阳县| 桂阳县| 政和县| 阿鲁科尔沁旗| 香港 | 佛冈县| 吴桥县| 兴隆县| 兴义市|