用Java實現計算器

2021-07-30 23:16:54 字數 2757 閱讀 2852

在學習《資料結構》這門課的時候,老是會想到模擬計算器的運算。雖說實驗裡面也有設計逆波蘭計算器的題目,但它只考察了棧和佇列的操作思想,沒有考慮到運算子的優先順序以及複雜組合情況(比如多層括號),因此其實用性並不大。

今天試著寫了一下,看似很簡單,還是花費了一段時間的。

這是最簡單的情況。

1. 首先+-的運算等級最低,而且沒有括號的限制。

2. 其次我們只需要把相應的數字部分讀到乙個物件中,運算子存放到另外乙個物件裡面。

3. 最後將字串數字轉換為int型,運算子轉換為char型,依次計算得出結果。

下面直接貼**了:

public

static

double

handlejjfh(string s)

if (judgefh(s.charat(i)) || (i + 1 == s.length()))

q.offer(strtonum(strnum));

q = i + 1;

i++;}}

//取出頭部元素

double a = q.poll();

i = 0;

while (!q.isempty())

return a;

}

需要注意的是stack和queue的泛型引數必須是類型別。

用到的輔助函式如下:

public

static

double

twocalu(double a, char c, double b);

public

static

double

strtonum(string s);

同樣的*/運算子也適用

*/的運算等級要比+-的高,因此情況稍微複雜一點。

大致思路是:將處於相鄰+-之間的字串擷取下來。那麼擷取下來的字串只有*/運算子或者沒有,這樣情況便簡化成了處理純符號(+-)字串(1)

直接貼**:

//該方法可能要做優化

public

double

handleall_nonbracket(string s)

//發現+/-運算子

if (judgejj(s.charat(i)))

//發現非第乙個+-

else

q = i;

i++;}}

if (countjj == 0)

return handlejjfh(s);

ccstr = s.substring(q + 1, s.length());

//如果含有*/

if (judgestrcc(ccstr))

q.offer(handlejjfh(ccstr));

else

//如果純數字

q.offer(strtonum(ccstr));

//取出頭部並且返回頭部值

double a = q.poll();

i = 0;

while (!q.isempty())

return a;

}

用到的輔助函式如下:

public

static

boolean

judgenum(char c);

public

static

boolean

judgecc(char c);

public

static

double

handlejjfh(string s);

public

static

double

strtonum(string s);

public

static

double

twocalu(double a,char c,double b);

帶有( )的字串運算優先順序是最高的,但無非也就是首先考慮它的運算,與*/類似。

我們首先考慮只有一對括號的字串:

把帶( )的string a擷取下來,計算得出結果double b,並將結果b轉換為string型別返回替代原有a的位置,這樣情況便簡化成了處理帶有(+-*/)字串(2)

queue< kuohao > l ,stack< kuohao > r是需要借助的資料結構。l用於記錄左括號的位置,並依次入佇列;r用於記錄右括號的位置,並且依次入棧。這樣左括號和右括號便能夠匹配成功。擷取括號便有了成功的把握。

多括號的字串處理

涉及到多括號處理的時候,最簡單的方法是使用遞迴。

public

double

handlebracket(string s)

}

用到的輔助函式如下:

public

double

kuohaonum(string s,queueleft,stackright);

public

double

handleall(string s);

public

static string numtostr(double t);

計算器的運算過程大致就是這樣了!

看似簡單的計算器實則大有門道。對於非程式設計師而言,他們可能對實現這樣的功能不屑一顧,但對程式設計師卻是極大的挑戰。就像現在的我,熬夜的痛苦誰人知!果然是術業有專攻,以後不敢小瞧其它專業了!

用棧實現計算器

我們平時用swith語句寫的計算器,只能處理簡單的兩個運算元和乙個運算子,這樣其實和日常應用方面差的有點遠,所以我們今天學習了一種用棧來實現一條複雜表示式的計算。這個需要用到棧的相關知識,除此之外我們還需要學會如何把中綴轉換成字尾表示式,比如 3 4 5 2 3這樣乙個表示式,從左至右遇到運算元壓入...

簡易計算器(Java實現)

本文參考自侵刪。一.ui介面的布置 窗體中放置三個jpanel面板,第乙個面板放數字與操作符元件 0 9,4 4網格布局,置於窗體中部 第二個面板放文字框,置於頂部 第三個面板放 清空 按鈕與 歷史記錄 按鈕,置於底部。窗體為邊界布局。按鈕上的數字 操作符使用陣列儲存,乙個for迴圈就能建立完按鈕並...

用matlab程式設計實現計算器

這學期開了軟體工程工具及其應用這麼課,任老師給我們教了matlab程式語言,做了課程實驗,自己用matlab實現了計算器,發現matlab確實是一門很有用得計算機程式語言,它把數值計算和視覺化環境整合到一起,非常直觀,而且提供了大量的函式,功能強大,工應用範圍廣泛。calculate.m 函式檔案,...