算術表示式求值(四則運算)

2021-05-26 04:57:20 字數 2042 閱讀 4159

1. 只考慮 + - * / ( ) 這幾個基本運算子,且是二元操作

2. 運算數隻考慮 0-9,這10個簡單的數,方便從string中取出來

3. 輸入的表示式沒有語法錯誤

【背景知識】

中綴表示法(infix expression):操作符位於兩個運算元中間,算術表示式的常規表示法。只用於二元操作符的情況,而且需要用括號和優先規則排除多義性。(a+b)*c-d/(e+f)

字首表示法(prefix expression):也叫波蘭表示法,操作符寫在運算元的前面。這種方法常用於編譯器設計方面。-*+abc/d+ef

字尾表示法(postfix expression),逆波蘭表示法,操作符位於運算元後面。這種方法使表示式求值很方便。ab+c*def+/-

前、字尾表示法的三個特徵:

1. 運算元的順序與等價的中綴表示法中運算元的順序一致

2. 不需要括號

3. 操作符的優先順序不相關

用二叉樹來表示更直觀,前、中、字尾表示法分別對應前序、中序、後序遍歷得到的結果。

【算符優先法】

輸入中綴表示式,直接求值。首先了解四則運算的規則:

(1) 先乘除,後加減

(2) 從左到右

(3) 先括號內,後括號外

根據以上3條規則,在運算的每一步,任意兩個相繼出現的算符optr1和optr2之間的優先關係有3種:

>:optr1的優先權高於optr2

=:optr1的優先權等於optr2

下表定義了算符之間的優先順序。豎:optr1,橫:optr2。 +

-*/(

)#+> 

-> 

*> 

/> 

()> 

#在表示式的兩頭,分別加個#符號,當##配對時,代表求值完成。

由規則(1),+ - 比* / 的優先權低;由規則(2),當optr1=optr2時,令optr1 > optr2;由規則(3),optr1為+ - * / 時的優先順序低於 ( 高於 ) ,當optr1為 ( 時,優先順序最低,optr1為 ) 時,優先順序最高。

演算法實現:使用兩個棧,分別存放操作符和運算元。

1)置運算元棧為空,起始符#入運算子棧。

2)依次讀入表示式中的每個字元,如是運算元,入運算元棧;如是運算子,和運算子棧頂符號比較優先權。直到表示式求值完畢,即##配對。

【字首->字尾表示式】

1)操作符棧為空,結果字串為空。

2)依次讀入中綴表示式的每個字元

-如是運算元,新增到結果字串

-如是左括號,入操作符棧

-如是右括號,彈出棧內符號,新增到結果字串,直到遇到棧內的左括號。彈出左括號。

-如是操作符,彈出棧內符號,新增懂啊結果字串,直到遇到左括號,或優先順序較低的操作符,或統一優先順序的右結合符號。此操作符入棧

3)如到達字串末尾,彈出所有棧內符號,新增到結果字串

【字尾表示式求值】

1)初始化運算元棧

2)從左到右依次讀入字尾表示式的每個字元,如是運算元,入棧;如是操作符,彈出兩個運算元,計算,結果入棧,直到表示式末尾。棧中的唯一數即是結果。注意彈出的第乙個運算元是位於運算子右邊的數。

【二叉樹法】

可以根據字首表示式,構造出二叉樹,後序遍歷即得到字尾表示式。

【手動方法】

(a+b)*c-d/(e+f)

1)按照運算子優先順序對所有運算單位加括號。(((a+b)*c)-(d/(e+f)))

2)字首:把運算子移動到對應的括號前面:-(*(+(ab)c)/(d+(ef))),再去掉括號:-*+abc/d+ef

3)字尾:把運算子移動到對應的括號後面:(((ab)+c)*(d(ef)+)/)-,再去掉括號:ab+c*def+/-

四則運算表示式求值

03 四則運算表示式求值 輸入輸入為四則運算表示式,僅由陣列 四則運算符 左右括號組成,不含空格。假設運算子結果都是整數。輸出輸出這個表示式的值 分析首先我們要搞清楚表示式的定義是什麼 表示式 由乙個或者多個項組成,多個項的表示式由 連線 項 由乙個或者多個因子組成,多個因子由 連線 因子 由 表示...

四則運算表示式求值

表示式求值是關於棧的應用,涉及到中綴與字尾式的轉換,本文關於10以內不帶括號的四則運算。9 3 4 x 3 24 1 x 9 5 9 9 5 x 9 4 6 2 x 3 1 42 思路 遇到數字直接入數字棧。遇到運算子,第乙個運算子直接入符號棧,後面的需要與符號棧棧頂元素比較優先順序。若當前優先順序...

百練 四則運算表示式求值

總時間限制 1000ms 記憶體限制 65536kb 描述 求乙個可以帶括號的小學算術四則運算表示式的值 輸入一行,乙個四則運算表示式。表示乘法,表示除法 輸出一行,該表示式的值,保留小數點後面兩位 樣例輸入 輸入樣例1 3.4輸入樣例2 7 8.3 輸入樣例3 3 4.5 7 2 3 3 4 2 ...