用java實現了乙個小的計算器演算法

2021-05-28 15:54:57 字數 3337 閱讀 4780

突然之間心血來潮,就是想試一試資料結構怎麼用.到現在才感覺的,資料結構是一種思想,一種思維方式,用怎樣的方式去解決怎樣的問題,這些是資料結構和演算法給我們的.

言歸正傳吧,說說這個小計算器(其實還有太多需要擴充套件和改進的地方).暫時只侷限在加減乘除,因為定義的是int型別的,所以也限制在整數運算吧.

主要思路是這樣的:計算器最主要的部分是獲取使用者輸入,然後根據演算法將獲取到的輸入儲存成為二叉樹.當然,肯定要用棧儲存的.

先看一下簡單的分析:

1+2-3:  儲存成二叉樹應該是這樣的:節點上的值為運算子,左右孩子為數值:

+    3

1    2  

也就是說,存好後用後序方法來進行讀取,然後計算.

如果有*和/,則如下:

1+2*3-6/2:

1   *  6  2

2  3   

其實,從這些分析上,可以得出乙個結論,暫且是對於這個計算器範圍內的結論(沒有括號之類的...)

(1)兩個棧,乙個ctack,用來存放暫時的操作符,乙個ttack,用來存放二叉樹.兩個棧結構,乙個棧存放的是string型別,另乙個存放二叉樹node型別.

(2)一次對使用者輸入的字元進行遍歷,通過下面的原則判斷是否壓棧還是出棧組成二叉樹.

方式:首先,在輸入字元是數字時,先建立乙個ttack,左右孩子賦值為null,data值賦值為數字.

輸入遍歷到操作符時:a: ctack為空;b:ctack當前操作符優先順序《讀入的操作符 ; 壓棧ctack

aa:ctack當前操作符優先順序》=讀入操作符優先順序,新建node,出棧ttack中的兩個node分別

作為新node的左右孩子,操作符作為節點值,之後再次壓棧ttack.

(3)讀完後,如果ctack還不是null,則以此取出ttack中的兩個node作為新node的左右孩子,ctack出棧的操作符作為節點值.之後壓棧.

思路大體就是這樣,這個過程中其實有很多問題,其中比較難的是:如果操作符和已經有的是相等的關係,那麼就是迴圈進行新建節點,壓棧這些操作.

核心程式:

package com.pipi.mainprocess;

import com.pipi.structure.node;

import com.pipi.structure.operatorstacks;

import com.pipi.structure.stacks;

import com.pipi.util.checkpriority;

import com.pipi.util.operate;

public class structure

}else

ctack.push(string.valueof(cc[i]));}}

while(ctack.getpoint() > 0)

//計算最後的值

int result = operate.getresult(ttack.pop());

/*** 遍歷二叉樹元素,得出結果後沒有用啦

*/int j = ttack.getpoint(); //當前棧中的個數

for(int i = 0; i < j; i++)

/*** 遍歷操作符,最後沒有了

*/int k = ctack.getpoint();

for(int i = 0; i < k; i++)

// return "";

return result+"";

}}

對棧的操作:

package com.pipi.structure;

public class operatorstacks

return "###"; }

public string pop()

return sb[point];

}public void push(string n)

public int getpoint()

public void setpoint(int point)

public string getsb()

public void setsb(string sb)

}

工具操作:其中getresult方法用到了遞迴呼叫的方法.

package com.pipi.util;

import com.pipi.structure.node;

import com.pipi.structure.operatorstacks;

import com.pipi.structure.stacks;

/** * 兩個數之間的計算

* @author ya皮皮

* */

public class operate else if(str.equals("-"))else if(str.equals("*"))else

return 0+"";}}

/***

* @param ttack

* @param ctack

* @return

*///計算

public static int getresult(node n)else

return integer.parseint(result);

} /**

* 判斷是不是操作符

*/public static boolean isoperate(string str)

}

定義優先順序:

public class checkpriority 

if(s.equals("*") || s.equals("/"))else if(s.equals("+") || s.equals("-"))else

}}

定義二叉樹:

package com.pipi.structure;

/** *

* @author pipi

* 定義二叉樹

*/public class node

public void setdata(string data)

public node getlchild()

public void setlchild(node lchild)

public node getrchild()

public void setrchild(node rchild)

}

總結:

其實,這個程式只是實現了乙個思想,還有很多沒有考慮到的地方,還有很多**需要重構.總的來說,學會了這種思想也是乙個小小的進步,接下來會好好完善一下**.

gogo~

用Java實現計算器

在學習 資料結構 這門課的時候,老是會想到模擬計算器的運算。雖說實驗裡面也有設計逆波蘭計算器的題目,但它只考察了棧和佇列的操作思想,沒有考慮到運算子的優先順序以及複雜組合情況 比如多層括號 因此其實用性並不大。今天試著寫了一下,看似很簡單,還是花費了一段時間的。這是最簡單的情況。1.首先 的運算等級...

實現乙個計算器

一直以來,我都想寫一門語言,但無從下手。我找到了很多編譯原理的教程,但始終覺得內容晦澀,理解不了,所以先嘗試寫乙個簡單的,比如 計算器。網上有很多關於計算器的實現,但大多需要有編譯原理的基礎,對於我這種小白實在難以理解。我決定採用暴力模擬的方式,需要用正規表示式,但我不想自己實現,所以用js。計算器...

實現乙個計算器

一直以來,我都想寫一門語言,但無從下手。我找到了很多編譯原理的教程,但始終覺得內容晦澀,理解不了,所以先嘗試寫乙個簡單的,比如 計算器。網上有很多關於計算器的實現,但大多需要有編譯原理的基礎,對於我這種小白實在難以理解。我決定採用暴力模擬的方式,需要用正規表示式,但我不想自己實現,所以用js。計算器...