時間限制:
3000
ms | 記憶體限制:
65535
kb 難度:
4描述
acm隊的mdd想做乙個計算器,但是,他要做的不僅僅是一計算乙個a+b的計算器,他想實現隨便輸入乙個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。
比如輸入:「1+2/4=」,程式就輸出1.50(結果保留兩位小數)
輸入第一行輸入乙個整數n,共有n組測試資料(n<10)。
每組測試資料只有一行,是乙個長度不超過1000的字串,表示這個表示式,每個表示式都是以「=」結束。這個表示式裡只包含+-*/與小括號這幾種符號。其中小括號可以巢狀使用。資料保證輸入的運算元中不會出現負數。
資料保證除數不會為0
輸出每組都輸出該組表示式的運算結果,輸出結果保留兩位小數。
樣例輸入
21.000+2/4=
((1+2)*5+1)/4=
樣例輸出
1.504.00
主要思路:判斷相鄰的兩個運算子(5+1-2)後
做一次運算。運算子、資料分別存入兩個棧。先存後取,取出兩個資料(5和1),運算子取出('-'減號)運算,(取出資料與運算子後清空取出的東西)把結果(5-1=4)存入資料棧。以此類推。遇見右括號就把左邊的運算完。詳細看**。
#include#include#include#includeusing namespace std;
char s[1010];
stackosta;//運算子 棧
stackdsta;//資料 棧
int main()
i--;
if(b!=0)//判斷小數字數並把資料壓入棧
dsta.push(m/pow(10,i-b));
else
dsta.push(m);
} /*開始判斷加減還有乘除符號,相當於每兩個運算子之間運算一次*/
else if(s[i]=='-'||s[i]=='+')
dsta.push(c);//壓入運算結果
osta.pop();//清除運算過的運算子
}osta.push(s[i]);//壓入下乙個運算子
} else if(s[i]=='*'||s[i]=='/')
else if(osta.top()=='/')
osta.push(s[i]);//壓入下乙個運算子
}else if(s[i]==')')//右括號前面的需要全部計算
dsta.push(c);//存放計算過的資料
osta.pop();//清除運算過的運算子
}osta.pop();//清除左括號
} }
printf("%.2lf\n",dsta.top());
dsta.pop();//清空
} return 0;
}
nyoj(表示式求值)
描述 acm隊的mdd想做乙個計算器,但是,他要做的不僅僅是一計算乙個a b的計算器,他想實現隨便輸入乙個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。比如輸入 1 2 4 程式就輸出1.50 結果保留兩位小數 輸入 第一行輸入乙個整數n,共有n組測試資料 n 10 每組測試資料只...
表示式求值問題
這是清華大學鄧俊輝資料結構 c 中的乙個案例,通過使用棧這種資料結構,完成了較為複雜的表示式求值問題,以下 是我整理改編而成,能夠完成加減乘除,乘方 階乘的運算,以及括號的處理。在這裡,我使用到了c stl 中的容器stack。include include include include incl...
NYOJ 409表示式求值
include include include include include include includeusing namespace std define max 1005 define clr arr memset arr,0,sizeof arr struct nodes class e...