1. 程式人生 > >mini dc與簡易計算器 20165235

mini dc與簡易計算器 20165235

main ber expr 調用函數 char s 不可 不同的 截圖 href

mini dc

任務內容

本次mini dc任務就是通過補充代碼來實現整型數據的後綴表達式計算

相關知識

  • 通過利用堆棧這一先進後出的數據結構來實現後綴表達式的計算。通過Stack<Integer> stack建立一個為int類型的堆棧stack。可以使用stack.push();來進行壓棧,stack.pop();來進行彈棧。
  • 通過調用private boolean isOperator (String token)來判斷按空格標記分隔好的String數據是否為運算符。
  • 使用正則表達式“[0-9]+”來判斷是否為字符整數類型。
  • StringTokenizer類是一種可以按不同的風格對String

    類型數據做分隔,有兩種構造方法。StringTokenizer(String s),則按照空格,換行,Tab等符號來做分隔標記。StringTokenizer(String s,String delim)則按照delimit字符序列中的任意排列來作為分隔標記。

    實現代碼

    import java.util.Stack;
    import java.util.StringTokenizer;
    import java.util.*;
    public class MyDC
    {
    /** constant for addition symbol */
    private final char ADD = ‘+‘;
    /** constant for subtraction symbol */
    private final char SUBTRACT = ‘-‘;
    /** constant for multiplication symbol */
    private final char MULTIPLY = ‘*‘;
    /** constant for division symbol */
    private final char DIVIDE = ‘/‘;
    /** the stack */
    private Stack<Integer> stack;
       // MyDC my= new MyDC();
    public MyDC() {
        stack = new Stack<Integer>();
    }
    
    public int evaluate (String expr)
    {
        int op1, op2, result = 0;
        String token;
        StringTokenizer tokenizer = new StringTokenizer (expr);
        while (tokenizer.hasMoreTokens())
            {
            token = tokenizer.nextToken();
                //System.out.println(token);
            //如果是運算符,調用isOperator
            if (isOperator(token))
            {
                char []c=token.toCharArray();
                op1=stack.pop();
                //從棧中彈出操作數2
                op2=stack.pop();
                //從棧中彈出操作數1
                result=evalSingleOp(c[0],op1,op2);
                //根據運算符和兩個操作數調用evalSingleOp計算result;
                stack.push(result);
                //計算result入棧;
            }
            else{
                //如果是操作數
                if(token.matches("[0-9]+")) {
                    int number=Integer.parseInt(token);
                    stack.push(number);
                }
            }
        }
        return result;
    }
    
    private boolean isOperator (String token)
    {
        return ( token.equals("+") || token.equals("-") ||
                token.equals("*") || token.equals("/") );
    }
    
    private int evalSingleOp (char operation, int op1, int op2)
    {
        int result = 0;
    
        switch (operation)
        {
            case ADD:
                result = op1 + op2;
                break;
            case SUBTRACT:
                result = op1 - op2;
                break;
            case MULTIPLY:
                result = op1 * op2;
                break;
            case DIVIDE:
                result = op1 / op2;
        }
    
        return result;
    }
    }

    代碼運行截圖

    技術分享圖片

    簡易計算器

    任務內容

    實現一個簡易計算器Calc,支持+ - x /%運算, 從命令行傳入計算數據,Calc計算器可以進行簡單的計算。

    相關知識

  • 要使用到堆棧的一些基本知識,通過Stack<Integer> stack=new Stack<Integer>();來建立一個int數據類型的堆棧,來存放操作數,Stack<Character> stack1=new Stack<Character>();來建立一個char數據類型的堆棧來存放運算符。
  • 使用StringTokenizer fenxi=new StringTokenizer(str);
    來對輸入的String類型的數據進行按空格進行做分隔。
  • 需要通過isOperator來判斷是否為運算符,通過matches()和正則表達來判斷是否為操作數。

    實現過程

    通過命令行傳入String類型的數據,然後對傳入的數據進行按空格做分隔標記,然後對分隔好的String數據類進行判斷是否為運算符或操作數,如果是運算符則對運算符進行壓棧(壓入stack1),如果是操作數就i++,並且對操作數進行壓棧(壓入stacki++,當i=2時就說明stack棧中已經壓入兩個操作數,所以stack進行兩次彈棧,stack1進行一次彈棧,然後調用函數int evalSingleOp (char operation, int op1, int op2);來計算結果,最後將結果返回。

實現代碼

import java.io.IOException;
import java.util.*;
public class CalczOperator  {
    /** constant for addition symbol */
    private final char ADD = ‘+‘;
    /** constant for subtraction symbol */
    private final char SUBTRACT = ‘-‘;
    /** constant for multiplication symbol */
    private final char MULTIPLY = ‘x‘;
    /** constant for division symbol */
    private final char DIVIDE = ‘/‘;
    /** constant for MOD symbol */
    private final char MOD = ‘%‘;
    /** the stack */
    Stack<Integer> stack=new Stack<Integer>();
    Stack<Character> stack1=new Stack<Character>();
     int operate(String str)throws IOException {
        int op1,op2,result=0;
        int i=0;
        String string;
        StringTokenizer fenxi=new StringTokenizer(str);
        while (fenxi.hasMoreTokens())
        {
            string = fenxi.nextToken();
            //如果是運算符,調用isOperator
            if (isOperator(string))
            {
                char c[]=string.toCharArray();
                stack1.push(c[0]);
            }
            else{
                //如果是操作數
                if(string.matches("[0-9]+")) {
                    i++;
                    int number=Integer.parseInt(string);
                    stack.push(number);
                    if(i==2){
                        op1=stack.pop();
                        op2=stack.pop();
                        result=result=evalSingleOp(stack1.pop(),op2,op1);
                    }
                }
            }
        }
        return result;
    }
private int evalSingleOp (char operation, int op1, int op2)
        {
        int result = 0;

        switch (operation)
        {
        case ADD:
        result = op1 + op2;
        break;
        case SUBTRACT:
        result = op1 - op2;
        break;
        case MULTIPLY:
        result = op1 * op2;
        break;
        case DIVIDE:
        result = op1 / op2;
        break;
        case MOD:
        result = op1 % op2;
        break;
        }

        return result;
        }
 private boolean isOperator (String token)
    {
        return ( token.equals("+") || token.equals("-") ||
                token.equals("x") || token.equals("/") ||token.equals("%"));
    }

}
import java.io.IOException;
public class Calc  {
    public static void main (String args[]){
        try {
            CalczOperator calczoperator = new CalczOperator();
            String[] prt = new String[args.length];
            for(int i =0;i<args.length;i++){
                prt[i] = args[i];
            }
            String str = prt[0]+" "+prt[1]+" "+prt[2]
            int result = calczoperator.operate(str);
            System.out.println(str + " = " + result);
        }
        catch (IOException e){
            System.out.println("error");
        }
    }
}

代碼運行截圖:

技術分享圖片

遇到的問題以及解決過程

當運行代碼java Calc 3 * 2,時報錯,對其他的運算符都能正常運行出結果,只有*運算符不可以,我在UbuntuWindows的命令行中都運行了一遍,但都會報錯。
技術分享圖片
我通過JDB調試,print args[]中的數值時,args[1]args[2]的數據出錯。
技術分享圖片

技術分享圖片

所以我認為傳入的數據中含有*的原因,所以我用x代替了*進行傳值。最後結果正常。

代碼鏈接

  • 簡易計算器代碼鏈接
  • mini dc代碼鏈接

    心得體會

    在做簡易計算器和mini dc程序時,主要是對堆棧這一數據結構的靈活使用,以後多多練習,可以寫出四則混合運算,把計算優先級考慮進去。

mini dc與簡易計算器 20165235