JAVA數據結構 - 棧與中綴表達式,後綴表達式實現簡單計算器

先進後出的數據結構,入棧,出棧 , 定義一個指針始終指向棧頂,沒有數據時爲-1

 

1.使用數組模擬實現棧-定義結構

class ArrayStack {
    private int MaxSize;   //表示棧的最大空間
    private int[] array;    //表示存放數據的數組
    private int top = -1;    //表示棧頂,起始位置爲-1表示無數據

    public ArrayStack(int maxSize) {    初始化棧
        MaxSize = maxSize;
        array = new int[maxSize];
}}

2.棧的方法

   1.有數據時 top從0開始   所以 top=maxSize -1 時爲滿               2.top=-1時爲空

   3.入棧時,將top上移,然後將數據添加到top指向位置             4.出棧時 將top下移,數據並沒有真實出棧,只是top指向棧頂數據變化

   5.遍歷棧時, 從棧頂開始遍歷

    public Boolean isFull() {         當棧頂爲最大空間-1時滿,因爲top從0開始
        return top == MaxSize - 1;
    }

    public Boolean isEmpty() {      當top=-1時,棧爲空
        return top == -1;
    }

  添加一個數據, 入棧
    public void push(int num) {
        if (isFull()) {
            System.out.println("棧爲滿,不能添加~~");
            return;
        }
        top++;
        array[top] = num;        }

    * 彈出棧頂數據, 出棧
    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("棧爲空,不能出棧~!");
        }
        int value = array[top];
        top--;
        return value;            }

二.中綴表達式與棧實現 簡單計算器

  1.前綴表達式   (3+4)×5-6 對應的前綴表達式就是 - × + 3 4 5 6

     .從右往左掃描表達式  遇到數字入棧 ,遇到符號 彈出 倆個數字   number1  number2       使用 number1 運算符 number2

   2.中綴表達式   綴表達式就是常見的運算表達式,如(3+4)×5-6   人們常用計算方法

   3.後綴表達式   (3+4)×5-6 對應表達式就 3 4 + 5 × 6

      .從左往右掃描表達式  遇到數字入棧 ,遇到符號 彈出 倆個數字   number1  number2       使用 number2 運算符 number1

2.中綴表達式計算 大致思路

  1.準備兩個棧      1. 存放數據棧       2.存放符號棧        

  2.若果是符號:  1.如果符號棧爲空 或者 當前符號優先級大於 棧頂符號的優先級  則直接入棧     

                          2.如果 當前符號優先級小於 棧頂符號的優先級  則取出數據棧兩個數字 num1, num2  取出一個運算符

                          做運 算 num2 運算符 num1,  得到運算結果入數據棧, 並將新符號入棧

3.最後 掃描完成,依次  取出兩個數據 一個運算符 做運算,將結果入棧

 留在數據棧中的數字就爲最後計算結果

列如表達式  expression = "3+2*3-1";   

  1.第一次掃描  數據棧   爲3 ,2,3         符號棧爲+ ,*        2.掃描到-時,  優先級小於*    取出數據棧兩個數字運算得到6    然後入棧

  3.數據棧   爲3,6 ,1       符號棧爲+  ,-                       

   5.依次  取出兩個數據 一個運算符 做運算,將結果入棧         6.最後數據棧數字爲8

三.後綴表達式與棧實現 簡單計算器

 1.後綴表達式更適合計算器計算,  而中綴表達式更適合人類計算    後綴表達式也叫   逆波蘭表達式

  2.如下:      中綴表達式    (30+4)*5-6    轉換爲後綴  "30 4 + 5 * 6 -"          並將每個字符放入集合      [3, 4, +, 5, *, 6, -]

public List<String> getArrayList(String expression) {

        List<String> expresList  = new ArrayList<>();

        String[] s = expression.split(" ");
        for (String s1 : s) {
            expresList.add(s1);
        }
        return expresList;   }

3.遍歷 [3, 4, +, 5, *, 6, -]  計算, 使用java 提供的 棧

   1.如果是數字直接入棧       2.如果是符號 取出棧中兩個數字  與當前符號計算  並將結果入棧   3.最終棧中留下一個數字爲結果

private int Calculator(List<String> arrayList) {
        Stack<String> stack = new Stack<>();
        for (String item : arrayList) {
            if (item.matches("\\d+")){
                stack.push(item);
            }else {
                int num1 = Integer.parseInt(stack.pop());
                int num2 = Integer.parseInt(stack.pop());
                int res= 0;
                if (item.equals("+")){
                    res=num2+num1;
                }else if (item.equals("-")){
                    res=num2-num1;
                }else if (item.equals("*")){
                    res=num2*num1;
                }else if (item.equals("/")){
                    res=num2/num1;
                }else {
                    throw new RuntimeException("符號錯誤!");
                }
                stack.push(res+"");
            }}
        return Integer.parseInt(stack.pop());   }     29

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章