題目描述:
讀入乙個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
輸入:測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。
輸出:對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。
樣例輸入:
1 + 24 + 2 * 5 - 7 / 11
0
樣例輸出:
3.0013.36
解題思路:
能夠用語言描述演算法過程,是正確程式設計的第一步。
設立兩個堆疊,乙個儲存運算子,另乙個儲存數字。
從左至右遍歷字串,若遇到操作符,則比較該操作符與棧頂操作符優先順序大小。如果棧為空,或者該操作符優先順序比棧頂操作符的優先順序大,則將該操作符壓入棧;否則,若該操作符不大於棧頂操作符,則彈出棧頂操作符,然後從數字棧中彈出兩個棧頂數字完成運算後壓入數字棧,重複比較該操作符與棧頂操作符優先順序大小,直到該操作符優先順序比棧頂操作符的優先順序大,則將該操作符壓入棧;
若遍歷結束時,取出數字棧中數字就是所求。
實現上的技術:
對操作符編號,使用乙個優先順序矩陣判斷優先順序大小;
在表示式的首尾新增標記運算子,該運算子優先順序最低;
使用gets讀取一行,然後呼叫函式getop,不斷取節點
使用double型別儲存運算結果和數字棧型別
**:
#include #include #include #includeusing namespace std;
char str[201];
stackop;
stacknum;
//優先順序矩陣
//運算子編碼:
//0 首尾
//1:+
//2:-
//3:*
//4:/
int mat[5][5]=;
void getop(bool &reto,int &retn,int &i)
if(str[i]==0)
if(str[i]>='0'&&str[i]<='9')
if(str[i]==' ')
return;
}else
i+=2;
return; }}
int main()
while(!num.empty())
int idx=0;
bool retop;
int retnum;
while(true)elseelse if(tmpop==2)else if(tmpop==3)else if(tmpop==4)
num.push(tmpnum);
}op.push(retnum);//不要忘了壓入棧 不要忘了壓入棧 不要忘了壓入棧
}}else
if(op.size()==2&&op.top()==0)
} printf("%.2f\n",num.top());
}}
棧實現簡易計算器
計算數學表示式的值。輸入數學表示式,輸出表示式的計算結果。數學表示式由單個數字和運算子 構成,例如 2 3 4 5 6 4。include include include include using namespace std double result int tag template class...
利用棧實現簡易計算器
輸入數學表示式,輸出結果。其中符號支援加減乘除 乘方及括號,數字支援小數及負數。開兩個陣列,乙個陣列為符號棧,乙個陣列為數字棧。字串讀入表示式並逐位處理,有數字就擷取下來存入數字棧,運算符號截下來存入符號棧,若發現當前符號優先順序小於等於前乙個符號的優先順序,就要把前面那部分的值計算出來,例如3 2...
簡易計算器
include include include char xpr expression int level char ch double calc int lim return ret int main cal的遞迴使用,利用了當 運算子運算完畢以後,仍然會留在這個位置 比如式子 3 5 2 的分析...