HDU 1237簡易計算機(stack)

4521 ワード

たんじゅんけいさんき
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 27155    Accepted Submission(s): 9861
Problem Description
+、-、*、/のみを含む非負の整数計算式を読み込み、その値を計算します.
Input
テスト入力には、各テスト・インスタンスが1行を占め、各行が200文字を超えず、整数と演算子の間にスペースで区切られたいくつかのテスト・インスタンスが含まれます.不正な式はありません.1行に0しかない場合は入力が終了し、対応する結果は出力されません.
Output
各テストケースに1行、すなわち式の値を小数点以下2桁まで出力します.
Sample Input
1 + 2
4 + 2 * 5 - 7/11
0
Sample Output
3.00
13.36
Method1:
計算機の演算優先度はスタックで実現するのに最適で、スタックに入る前に制御すればよい.
*/+-このような優先順位は、getcharが各演算子を読み込み、スペースを食べるようにすればよい.
/*
  Problem : 1237 (       )     Judge Status : Accepted
  RunId : 27199222    Language : G++    Author : html_11
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define mod 998244353
#define INF 0x3f3f3f3f
#define Min 0xc0c0c0c0
#define mst(a) memset(a,0,sizeof(a))
#define f(i,a,b) for(int i=a;is;
int main(){
    int n;
    double m;
    while(scanf("%d", &n) != EOF){
        char c = getchar();
        if(c == '
' && n == 0) break; s.push(n); c = getchar(); while(scanf("%d", &n) != EOF){ if(c == '*'){ m = s.top(); m *= n; s.pop(); // s.push(m); } else if(c == '/'){ m = s.top(); m /= n; s.pop(); // s.push(m); } else if(c == '+'){ s.push(n); } else if(c == '-'){ s.push(0 - n); } c = getchar(); if(c == '
') break; c = getchar(); } double res = 0; while(!s.empty()){ res += s.top(); s.pop(); // : } printf("%.2lf
", res); } return 0; }

 Method2:
1行のデータを直接読み込み、各値の詳細を処理
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef long long ll;
using namespace std;
int main() {
	string str;
	while (getline(cin, str)) {
		if (str == "0") return 0;
		//cout << str << endl;
		stack S;
		int len = str.length();
		for (int i = 0; i < len; i++) {
			if (str[i] == ' ') continue;
			int v = 0;
			bool sign = false;
			while (isalnum(str[i]) && i < len) {
				v = v * 10 + str[i] - '0';
				i++;
				sign = true;
			}
			if(sign) S.push(v);	//         ,        0       
			if (i < len && str[i] == ' ') i++;
			if (str[i] == '*') {
				i += 2;						//   
				double p = S.top();
				S.pop();
				v = 0;
				while (isalnum(str[i]) && i < len) {	//       
					v = v * 10 + str[i] - '0';
					i++;
				}
				S.push(p * (double)v);
			}
			else if (str[i] == '/') {
				i += 2;
				double p = S.top();
				S.pop();
				v = 0;
				while (str[i] >= '0' && str[i] <= '9' && i < len) {
					v = v * 10 + str[i] - '0';
					i++;
				}
				S.push(p / v);
			}
			else if (str[i] == '-') {
				i += 2;
				v = 0;
				while (str[i] >= '0' && str[i] <= '9' && i < len) {
					v = v * 10 + str[i] - '0';
					i++;
				}
				S.push(-v);
			}
			else if (str[i] == '+') {
				i += 2;
				v = 0;
				while (str[i] >= '0' && str[i] <= '9' && i < len) {
					v = v * 10 + str[i] - '0';
					i++;
				}
				S.push(v);
			}
		}
		double res = 0;
		while (!S.empty()) {
			//printf("%f
", S.top()); res += S.top(); S.pop(); } printf("%.2f
", res); } return 0; }