時間限制:
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
棧的基本應用。。。
寫的很爛。。。醉了。。。
#include #include #include using namespace std;
int judge(char symbol)//優先順序判斷
}int main()
while(a[i] >='0' && a[i] <= '9')
while(temp2 >= 1)
while(flag)
temp += temp2;//將小數部分加到整數部分上}}
figure.push(temp);//數入棧
}if(a[i] == '(')
if(a[i] == '+' || a[i] == '-' || a[i] == '*' || a[i] == '/')
sym_top = symbol.top();
while(judge(a[i]) <= judge(sym_top))//關鍵,將當前運算子與棧頂比較,進行從左到右計算
symbol.pop();
if(symbol.empty())
break;
sym_top = symbol.top();
}symbol.push(a[i]);
i++;
}if(a[i] == ')')//遇到又括號全部計算直到相遇「)」為止
symbol.pop();
sym_top = symbol.top();
}symbol.pop();//將"("出棧
i++;}}
while(!symbol.empty())//將棧中剩餘的進行運算
symbol.pop();
}printf("%.2lf\n",figure.top());//數的棧頂即為最終值
}return 0;
}
NYOJ35 表示式求值
搞了差不多2天,原來乙個是sstream的用法困惑好久,需要對陣列清零 include include include include include include includeusing namespace std char mid 1008 post 1008 char compare ch...
nyoj 35 表示式求值
描述 acm隊的mdd想做乙個計算器,但是,他要做的不僅僅是一計算乙個a b的計算器,他想實現隨便輸入乙個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。比如輸入 1 2 4 程式就輸出1.50 結果保留兩位小數 輸入 第一行輸入乙個整數n,共有n組測試資料 n 10 每組測試資料只...
NYOJ 35 表示式求值
表示式分為字首表示式,中綴表示式,字尾表示式,對於不涉及運算子優先順序的用中綴表示式直接做比較方便,如果涉及到的優先順序的把中綴表示式轉化成字首或字尾表示式比較方便。本體我用的是字首表示式解題。include include include include includeusing namespac...