HDU1237 簡單計算器【堆疊】
阿新 • • 發佈:2019-02-14
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 21518 Accepted Submission(s): 7722Problem Description 讀入一個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
Input 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用一個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。
Output 對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。
Sample Input 1 + 2 4 + 2 * 5 - 7 / 11 0 Sample Output 3.00 13.36 Source
問題描述 :參見上文。
問題分析:這是一個表示式求值問題,可以用遞迴來處理,也可以用堆疊來處理。
程式說明:程式中,使用堆疊來處理運算子的優先順序,運算子和操作符分別放在兩個堆疊中。
參考連結:(略)
AC的C++語言程式:
/* HDU1237 簡單計算器 */ #include <iostream> #include <string> #include <stack> #include <cctype> #include <cstdio> using namespace std; int main() { string s; stack<char> op; stack<double> operand; double operand1, operand2; while(getline(cin, s) && s != "0") { for(int i=0; s[i]; i++) { if(isdigit(s[i])) { operand1 = 0; while(isdigit(s[i])) { operand1 = operand1 * 10 + s[i] - '0'; i++; } i--; operand.push(operand1); } else if(s[i] == '+' || s[i] == '-') { if(op.empty()) op.push(s[i]); else { char sop = op.top(); op.pop(); operand2 = operand.top(); operand.pop(); operand1 = operand.top(); operand.pop(); if(sop == '+') operand.push(operand1 + operand2); else operand.push(operand1 - operand2); op.push(s[i]); } } else if(s[i] == '*' || s[i] == '/') { char cop = s[i]; i += 2; operand2 = 0; while(isdigit(s[i])) { operand2 = operand2 * 10 + s[i] - '0'; i++; } i--; operand1 = operand.top(); operand.pop(); if(cop == '*') operand.push(operand1 * operand2); else operand.push(operand1 / operand2); } } while(!op.empty()) { char sop = op.top(); op.pop(); operand2 = operand.top(); operand.pop(); operand1 = operand.top(); operand.pop(); if(sop == '+') operand.push(operand1 + operand2); else operand.push(operand1 - operand2); } printf("%.2f\n", operand.top()); } return 0; }