九度 題目1101:計算表示式
阿新 • • 發佈:2019-02-18
時間限制:1 秒
記憶體限制:32 兆
特殊判題:否
提交:2740
解決:782
- 題目描述:
-
對於一個不存在括號的表示式進行計算
- 輸入:
-
存在多種資料,每組資料一行,表示式不存在空格
- 輸出:
-
輸出結果
- 樣例輸入:
-
6/2+3+3*4
- 樣例輸出:
-
18
#include <cstdio> #include <iostream> #include <cstring> using namespace std; const int MAXN = 25; int main() { int iData, iLen, arr[MAXN]; char c; while(scanf("%d", &iData) != EOF) { arr[0] = 0, arr[1] = iData; iLen = 1; while(~scanf("%c", &c) && c != '\n') { scanf("%d", &arr[++iLen]); switch(c) { case '+': break; case '-': arr[iLen] = -1*arr[iLen]; break; case '*': arr[iLen-1] = arr[iLen] * arr[iLen-1]; iLen--; break; case '/': arr[iLen-1] = arr[iLen-1]/arr[iLen]; iLen--; break; } } for(int i = 0; i <= iLen; ++i) arr[0] += arr[i]; printf("%d\n", arr[0]); } return 0; }
RE,有時間再改改,悲催!
#include <iostream> #include <cstdio> #include <cstring> #include <stack> #include <cstdlib> using namespace std; const int MAXN = 25; int PriorityOfOperater(char c) { if(c == '=') return 0; if(c == '+') return 1; if(c == '-') return 1; if(c == '*') return 2; if(c == '/') return 2; return 0; } void Comput_Num(stack <int> &oprand, stack <char> &oper) { int b = oprand.top(); oprand.pop(); int a = oprand.top(); oprand.pop(); switch(oper.top()) { case '+': oprand.push(a+b); break; case '-': oprand.push(a-b); break; case '*': oprand.push(a*b); break; case '/': oprand.push(a/b); break; default: break; } oper.pop(); } bool IsOper(char c) { if(c == '+' || c == '-' || c == '*' || c == '/') return true; return false; } int main() { int i, iLen; double num; char str[MAXN]; stack <int> oprand; stack <char> oper; while(~scanf("%s", str)) { //scanf("%s", str); iLen = strlen(str); str[iLen] = '='; str[++iLen] = '\0'; //printf("%s\n", str); for(i = 0; i < iLen; ++i) { if((i == 0 && str[i] == '-' && isdigit(str[i+1])) || ((i >= 1 && (i+1 < iLen)) && IsOper(str[i-1]) && str[i] == '-' && isdigit(str[i+1])) || isdigit(str[i])) { if(i == 0 && str[i] == '-' && isdigit(str[i+1])) { num = atof(&str[++i]); num *= -1; } else if((i >= 1 && (i+1 < iLen)) && IsOper(str[i-1]) && str[i] == '-' && isdigit(str[i+1])) { num = atof(&str[++i]); num *= -1; } else num = atof(&str[i]); while(i < iLen && (isdigit(str[i]) || str[i] == '.')) ++i; --i; oprand.push((int)num); } else { if(oper.empty() || PriorityOfOperater(str[i]) > PriorityOfOperater(oper.top())) oper.push(str[i]); else { while(!oper.empty() && PriorityOfOperater(str[i]) <= PriorityOfOperater(oper.top())) Comput_Num(oprand, oper); oper.push(str[i]); } } } oper.pop(); printf("%d\n", oprand.top()); oprand.pop(); str[0] = '\0'; } return 0; }