時間限制:
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 #include#includeusing namespace std;
bool isoperator(char ch);
char precede(char opr1, char opr2);
double operate(double opnd1, char op, double opnd2);
int converttoindex(char opr);
/** 這個是用來判斷乙個字元是不是
操作符的
*/bool isoperator(char ch)
//運算子的優先關係
//'+', '-', '*', '/', '(', ')', '#'
char oprrelation[7][7] = , //'+'
, //'-'
, //'*'
, //'/'
, //'('
, //')'
};//'#'
/** 這個是用來獲取每乙個操作符的優先順序
*/int converttoindex(char opr)
return index;
}/**
這個是用來獲取連個字元的優先順序
*/char precede(char opr1, char opr2)
/** 這個是用來對兩個數進行求值
*/double operate(double opnd1, char op, double opnd2)
return ret;
}//算符優先演算法
double caculateexpression(string exp)
double value = atof(g.c_str());
//運算元入棧
opnd.push(value);
ch = exp[i++];
}else
else
break;
case '>'://棧頂優先權高,先彈出,計算,結果運算元入棧
char op = optr.top();
optr.pop();
double num2 = opnd.top();//第二個運算元在前
opnd.pop();
double num1 = opnd.top();
opnd.pop();
double ret = operate(num1, op, num2);
opnd.push(ret);
break;}}
}//end of while
//運算元棧的唯一元素即為計算結果
return opnd.top();
}int main(){
int n;
scanf("%d",&n);
while(n--){
char str[1000];
scanf("%s",str);
// strcat(str,"#");
string f;
f=str;
//cout<
字尾表示式實現表示式求值
看到別人寫的乙個表示式求值程式,想到很久之前寫的乙個。中間有個字串轉數值型,可以用stringstream來實現或者c語言裡面的strtod直接得到 include include include include includeusing namespace std class data doubl...
表示式求值(c 實現)
今天寫了乙個表示式求值的程式。基本功能為 輸入乙個表示式比如23 34 21 56 45 1 然後程式求出結果。而且按照四則運算的優先順序,同時支援括號。下面是程式執行的畫面 程式的難點在於把乙個字串分解為運算元和操作符並能正確處理各個操作符的優先順序,特別是有括號的情況。本程式主要採用了傳統的方法...
表示式求值 棧實現
宣告 僅個人小記 演算法思想 一 設定乙個運算子棧,設定乙個字尾表示式字串 二 從左到右依次對中綴表示式中的每個字元ch分別進行一下處理,直至表示式結束 1.若ch是左括號 將其入棧 2.若 ch 是數字,將其後連續若干數字新增到字尾表示式字串之後,在新增空格作為分割符 3.若ch是運算子,先將棧頂...