codeup 1918 簡易計算器

2021-09-17 01:34:38 字數 1900 閱讀 4000

題目描述

讀入乙個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。

輸入

測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。

輸出

對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。

樣例輸入

30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92

0

樣例輸出

12178.21
思路

中綴表示式不利於計算(只能從後往前算,是錯的),所以要先轉化成字尾表示式,再計算。

轉為字尾表示式:

若是運算元,則入字尾表示式佇列;

若是操作符。若小於或等於操作符棧頂操作符優先順序,則不斷出棧,併入字尾表示式佇列,然後該操作符入操作符棧;若大於,則直接入佇列。(需提前用map 為操作符設定優先順序)

計算字尾表示式佇列不斷出佇列:

若是運算元,入運算元棧;

若是運算子,要從運算元棧中彈出兩個數,注意,第二個彈出的數才是被運算元。

直至隊列為空,此時運算元棧的棧頂元素就是計算結果。

後來提交一直答案錯誤的原因是:在string轉化為double 時,ans的值未初始化為0。導致輸入 0 - 0 時,輸出的是-0.00。

ac**

#include

#include

#include

#include

#include

#include

using namespace std;

struct node

;stack st;

queue que;

stack<

double

> out;

string s;

map<

char

,int

> opr;

double

todouble

(string s)

temp=1;

for(

int i=dot;ilength()

;i++

)return ans;

}void

change()

else

//若是運算子

st.push

(temp)

; i++;}

}while

(!st.

empty()

)//注意要把操作符棧中的剩餘操作符入佇列

}double

cal(

) que.

pop();

}}intmain()

while

(!st.

empty()

) st.

pop();

//初始化存放操作符的棧

while

(!out.

empty()

) out.

pop();

//初始化計算時存放運算元的棧

change()

;//把中綴表示式轉化為字尾表示式

cal();

//計算

printf

("%.2f\n"

,out.

top())

;}}

codeup1918簡單計算器

讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。30 90 26 9...

codeup 1918 簡單計算器

問題 a 簡單計算器 時間限制 1 sec 記憶體限制 32 mb 提交 2132 解決 877 提交 狀態 討論版 命題人 外部匯入 題目描述 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。輸入測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空...

codeup 1918 簡單計算器

codeup 1918 include include include include include include using namespace std struct node string srt stack s 操作符棧 queue q 字尾表示式序列 map char int op vo...