表示式求值

2021-10-13 04:50:56 字數 1365 閱讀 1757

以求解2+5*(3-2)為例,按照資料結構課本上的思路,是建立兩個棧,乙個數字棧,乙個符號棧,然後根據入棧的符號的優先順序來不斷出棧進行計算,理解起來是挺方便的,但是**記起來有點複雜,尤其是還需要兩個棧。

近日看了乙個老師的另外一種解法,利用遞迴的方式解決,不需要利用棧,聽起來賊神奇,並且也是比較好理解和記憶的,下面介紹下另外乙個老師的方法。

對於表示式2+5*(3-2)而言,我們先判斷這是乙個什麼式子,按照以往的經驗,我們會說這是乙個加法式,因為加法運算是這個式子中最後計算的。」+「把式子分為左右兩部分,左邊2,右邊5 x(3-2);接著看右邊這個式子,我們可以判斷這是乙個乘法式,判斷方式如上;**」 * 「**也同樣把式子分為兩部分,左邊為5,右邊為(3-2);那求解最開始的綜合式是否可以理解為f=a (operator) b,此處的operator可以是+、-、*、/中的任何一種情況;其中 a 和 b 的結果的求解方式和 f 的一樣,所以,這是乙個遞迴的過程。

確定遞迴求解的邊界和遞迴過程:

遞迴邊界

//此時表明輸入的表示式不存在運算子,都是數字

if(op ==-1

)// return num;

}

遞迴過程,即逐步求解 a 與 b 的過程

此時該如何確定operator的位置?根據我們以往的經驗,對乙個綜合式,計算順序為先乘除後加減,右括號先計算括號裡面的,所以先運算運算子最高的,對於我們開始的例子,應該是先計算(3-2);我們再回過來看開始的例子,例子的運算順序是 -、*、+,然而遞迴的順序是先開始的後返回,和入棧出棧的順序很想,先入後出,所以我們先找運算子中優先順序最低的,找到後確定左右的式子 a 和 b。然後再逐步確定 a 和 b 中的最低運算子,直到遍歷完字串的所有元素,

**如下:

//定義兩個變數 pri、cur_pri 記錄先前運算子和當前運算子的高低,因為我們要找出運算子最低的那乙個

//因為括號會改變運算子的順序,定義乙個變數 temp 來改變運算子的高低

intcalc

(char

*str,

int l,

int r)

//如果當前運算子優先順序小於等於先前的運算子優先順序,則替換

if(cur_pri <= pri)

//根據op 的位置確定 a 和 b

int a =

calc

(str, l, op)

;int b =

calc

(str, op +

1, r)

;switch

(str[op]

)return0;

}

如有不同見解,歡迎討論

表示式求值

程式的說明見清華大學出版社 資料結構 c語言版 include include define stack init size 40 define stackincrement 20 define ok 1 define false 0 typedef structs stack typedef st...

表示式求值

既然是表示式求值,自然需要在記憶體中儲存計算結果以及中間值。在 用c語言寫直譯器 一 中提過 變數要求是若型別,而 c 語言中的 view plaincopy to clipboardprint?in basic io.h define memery size 26 typedef enum var...

表示式求值

寫了乙個下午,各種糾結,各種問,終於搞明白了。但是自己還是想出來的一點東西的。很爽歪歪的,哈哈。先貼第一次的 include include include include include includeusing namespace std char data 7 7 int sign char ...