1. 程式人生 > >java表示式求值(可以輸入小數,支援指數運算)

java表示式求值(可以輸入小數,支援指數運算)

   努力學習資料結構和java中。。。這是第一個小程式,java編的表示式求值,以後每週編一個類似的,加油!

參考資料:編的時候主要參考的是嚴老師的c語言版資料結構這本書

收穫:熟悉了棧型別資料結構在實際中的應用,而且知道了java語言中的一些細節

思路:

第一步:讀取表示式

用如下程式碼讀取輸入的表示式:

用String類中的toCharArray()方法轉化為字元陣列(因為結束符標記為“#”,所以在後面加一個“#”)

經過上面的輸入處理,就可以進入正題了

第二步:優先順序設定

參考嚴老師的c語言版資料結構(P53),可以發現控制進棧和出棧的關鍵在於表示式的優先順序,我在書上原有的算符上加入指數運算“^",行列按照“+”,“-”,“*”,“/","^","(",")","#",得到如下優先順序矩陣:

注意同等優先順序的運算子,誰先進棧誰的優先順序大,例如3+2-4,過程:3入運算數棧,“+”入運算子棧,“2”入運算數棧,這是“-”來了,此時“-”,優先順序沒有“+”高(“+”先進棧的)。所以上面的矩陣不是對稱的。

第三步:輔助函式編寫

1.Boolean isnumber(char c)函式

在第一步中我們將輸入的表示式字串變成了字元陣列,在這一步中我們需要判斷輸入的字元是不是數字,如果是返回true,不是返回false,我們將0~9以及小數點‘.',當作數字,例如isnumber(‘.’)返回true,isnumber(‘1’)返回true,isnumber(‘/’)返回false.注意:這一 步只是單純的判斷每一個字元,例如表示式中有數32,我們只把它當作‘3’和‘2’,之後會處理這個問題。

2.int getOrder(char c)函式

這個就更簡單了,之前我們為運算子規定了優先順序矩陣,我們總不能通過字元索引到矩陣的元素吧,所以把輸入的運算子,轉化成對於的整數,例如getOrder('+'),返回0,因為矩陣第一行第一列是表示’+‘。

第四步:運算過程編寫

主題思路書上都有主要說一下細節

1.設定運算數棧optd,和運算子棧optr。先將“#”入optr棧,它對應輸入的字元陣列的結束標誌‘

2.每一次迴圈如何3.14這類的資料,將它轉化成double型

我們設定字串S來儲存這個數,設定初值S=null,我們知道在讀取的時候,我們判斷當前讀取的字元c是不是數,如果是S=S+String.valueOf(c),在判斷它下一個是不是數,如果是,顯然這兩個數是一體,我們繼續迴圈。如果不是,說明這個數結束了,此時我們可以用Double..valueOf(S)將他轉化成double形入optr棧,但要注意如果你是直接迴圈,因為S初值設定的是null,你最終得到的S=null3.14,而不是3.14,所以在處理是,我們做如下簡單處理:

然後根據嚴老師書上的步驟算下去就行。程式碼連線: