336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
후위표기식으로 값이 주어질 때 값을 계산하라.
N ~ [1,26]
expression
A1
A2
....
An
수가 주어지는 ABCD.... Z 까지는 스택에 넣는다. but 수식이 발생하면 스택에서 인자 두개를 꺼내서 계산 후 다시 스택에 집어 넣는다.
이 과정을 반복한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include<cstdio> #include<stack> #include<vector> #include<map> #include<utility> // pair using namespace std; typedef long double Lf; const int MAX = 10000; map<char, Lf> M; Lf operation(char op, Lf a, Lf b){ switch(op){ case '+': return a+b; case '-': return a-b; case '/': return a/b; case '*': return a*b; } return 0; } int main(){ int n; char e[MAX]; scanf("%d", &n); scanf("%s", e); for(int i = 0; i < n ; i++){ Lf val; scanf("%Lf", &val); M.insert(make_pair('A'+i, val)); } stack<Lf> S; for(int i = 0 ; e[i] != NULL ; i++){ if('A' <= e[i] && e[i] <= 'Z'){ S.push(M[e[i]]); }else{ Lf val = S.top(); S.pop(); val = operation(e[i],S.top(),val); S.pop(); S.push(val); } } printf("%.2Lf",S.top()); return 0; } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include<cstdio> #include<stack> #include<cstring> #define MAX 100000 using namespace std; typedef long double ld; ld value[26] = {0,}; char expr[MAX] = {0,}; int main(){ ld result = 0; stack<ld> s; int N = 0; scanf("%d", &N); scanf("%s", expr); for(int i = 0 ; i < N ; i++){ scanf("%Lf",&value[i]); } int slen = strlen(expr); for(int i = 0 ; i < slen ; i++){ ld tmp; if('A' <= expr[i] && expr[i] <= 'Z'){ s.push( value[expr[i] - 'A'] ); }else{ tmp = s.top(); s.pop(); switch(expr[i]){ case '+': tmp = tmp + s.top(); s.pop(); break; case '-': tmp = s.top() - tmp; s.pop(); break; case '*': tmp = tmp * s.top(); s.pop(); break; case '/': tmp = s.top() / tmp; s.pop(); break; } s.push(tmp); } result = s.top(); } printf("%.2Lf\n",result); return 0; } | cs |