製作計算器,包含字尾表示式的求法

2021-07-15 20:48:58 字數 2083 閱讀 9291

/*stl 中棧的使用方法(stack)

基本操作:

#include stack s

s.push(x) 將x加入棧中,即入棧操作

s.pop() 出棧操作(刪除棧頂),只是出棧,沒有返回值

s.top() 返回第乙個元素(棧頂元素)

s.size() 返回棧中的元素個數

s.empty() 當棧為空時,返回 true

*//*將乙個普通的中序表示式轉換為逆波蘭表示式的一般演算法是:

首先需要分配2個棧,乙個作為臨時儲存運算子的棧s1(含乙個結束符號),乙個作為輸入逆波蘭式的棧s2(空棧),

s1棧可先放入優先順序最低的運算子#,注意,中綴式應以此最低優先順序的運算子結束。

可指定其他字元,不一定非#不可。從中綴式的左端開始取字元,逐序進行如下步驟:

(1)若取出的字元是運算元,則分析出完整的運算數,該運算元直接送入s2棧

(2)若取出的字元是運算子,則將該運算子與s1棧棧頂元素比較,

如果該運算子優先順序大於s1棧棧頂運算子優先順序,則將該運算子進s1棧,

否則,將s1棧的棧頂運算子彈出,送入s2棧中,直至s1棧棧頂運算子低於(不包括等於)該運算子優先順序,

最後將該運算子送入s1棧。

(3)若取出的字元是「(」,則直接送入s1棧頂。

(4)若取出的字元是「)」,則將距離s1棧棧頂最近的「(」之間的運算子,逐個出棧,依次送入s2棧,此時拋棄「(」。

(5)重複上面的1~4步,直至處理完所有的輸入字元

(6)若取出的字元是「#」,則將s1棧內所有運算子(不包括「#」),逐個出棧,依次送入s2棧。

完成以上步驟,s2棧便為逆波蘭式輸出結果。不過s2應做一下逆序處理。便可以按照逆波蘭式的計算方法計算了!*/

/*計算方法:

新建乙個表示式, 如果當前字元為變數或者為數字,則壓棧,如果是運算子,

則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後,棧裡的就是結果。*/

/*我的演算法理解:

第一大步:把中綴表示式轉化為字尾表示式。

掃中綴式:

1.數字:直接取出進陣列ep

2.左括號:進棧op

3.右括號:從棧頂掃棧op,若不是左括號就出棧,加到陣列ep中,直到出現左括號,把左括號出棧

4.等號:將棧op中除'#'的元素全部輸出

5.運算子:比較棧頂與當前運算子優先順序,在棧頂優先順序高於當前運算子優先順序時,棧頂不斷出棧,

加到陣列ep中,否則,跳出迴圈,把當前運算子入棧。

第二大步:根據中綴表示式求值。

1.遇到數字:直接進棧num

2.遇到運算子:對棧頂的兩個元素進行出棧並運算,結果入棧num

3.遇到空格:自加,continue

4.遇到回車:直接跳出結束。

*///輸入要求:可以含有數字,小數點,運算子,以等號結束,最後加回車,不含有空格

#include #include #include #include #include #define n 1000

using namespace std;

stack op;//存字元的棧op

stack num;//儲存double資料的棧

int i,len,j;

char ch, str[n],ep[n];//str陣列儲存輸入的字串,ep陣列用於儲存字尾表示式

double calc(double a, char o, double b)//具體兩個元素的計算

}int pri(char ch)//根據符號返回優先順序

}void getnum()//把str中的數字串存到ep中

double getnum2()//把ep中的乙個數字以double型返回出來

void back()//op棧頂元素出棧,並進入ep中

void trans()//求字尾表示式

switch (str[i])

}}double cal()

if (ep[i] == '\n')//換行

if (ep[i] >= '0' && ep[i] <= '9')//數字

else//運算子

}}int main()

計算器 字尾表示式

不過目前這個功能太少,而且能算的十分有限,測試輸入為 4 4 5 3 測試輸出為 4 4 5 3 27 主要就是了解一下怎麼把中綴表示式轉化成字尾表示式,然後再利用字尾表示式求值,我後續會完善這個程式,做個真正意義上的計算器。o o 轉化步驟我搜尋了一下,大致如下 將中綴表示式轉換為等價的字尾表示式...

計算器(表示式計算 字尾表示式實現)逆波蘭表示式

問題描述 從標準輸入中讀入乙個整數算術運算表示式,如24 1 2 36 6 2 2 12 2 2 計算表示式結果,並輸出。要求 1 表示式運算子只有 表示式末尾的 字元表示表示式輸入結束,表示式中可能會出現空格 2 表示式中會出現圓括號,括號可能巢狀,不會出現錯誤的表示式 3 出現除號 時,以整數相...

字尾表示式做計算器程式

概念 字尾表示式是相較於中綴表示式而言的,像我們平時寫的2 3 4 5 6 7就是乙個中綴表示式,那麼如何將之變為字尾表示式呢?字尾表示式如何用來求解呢?先來第乙個問題 中綴 字尾 變為字尾表示式方法 規則 1.遇到運算元 直接新增到字尾表示式中 2.棧為空時,遇到運算子,直接入棧 3.遇到左括號 ...