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