Вы находитесь на странице: 1из 4

#include <stdio.

h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <assert.h>
#include <time.h>

#ifndef DOLPHIN
/// I love Dolphin
#endif

#define in(x) scanf("%d", &x)


#define out(x) printf("%d", x)
#define in_longlong(x) scanf("%lld", &x)
#define out_longlong(x) printf("%lld", x)

const int me = 3525;


const int OFFSET = 1000000000;
const int PLUS = OFFSET + 1;
const int MINUS = OFFSET + 2;
const int MULTIPLY = OFFSET + 3;
const int DIVIDE = OFFSET + 4;
const int OPEN_BRACKET = OFFSET + 5;
const int CLOSE_BRACKET = OFFSET + 6;

/*
((1+2)*3)
1+2*3
*/

char s[me];
int a[me];
int N, sign = 1, inside_number = 0;

int is_operation(char c, char *a, int pos, int length){


if(c != '+' && c != '-' && c != '*' && c != '/')
return 0;
if(pos == 0 || pos == length - 1)
return 0;
if(a[pos - 1] == '(')
return 0;
return 1;
}
int solve_easy(int *a, int N){
if(N == 0)
return 0;
//for(int i = 1; i <= N; i ++)
// printf("%d, ", a[i]);
//printf("\n");
int stack[me];
int ptr = 0;
if(N == 1)
return a[1];
for(int i = 1; i <= N; i ++){
if(ptr > 0 && stack[ptr] == MULTIPLY){
ptr --;
stack[ptr] = stack[ptr] * a[i];
}
else if(ptr > 0 && stack[ptr] == DIVIDE){
ptr --;
stack[ptr] = stack[ptr] / a[i];
}
else{
stack[++ptr] = a[i];
}
}
int result = stack[1];
//for(int i = 1; i <= ptr; i ++)
// printf("%d --> %d\n", i, stack[i]);
for(int i = 3; i <= ptr; i += 2){
if(stack[i - 1] == PLUS)
result += stack[i];
else{
assert(stack[i - 1] == MINUS);
result -= stack[i];
}
}
return result;
}

int solve(int *a, int N){


if(N == 1)
return a[1];
if(a[1] == OPEN_BRACKET && a[N] == CLOSE_BRACKET){
int b[me];
int ptr = 0;
for(int i = 2; i < N; i ++)
b[++ptr] = a[i];
return solve(b, N - 2);
}
int last_opened = -1;
int first_closed = -1;
for(int i = 1; i <= N; i ++){
if(a[i] == OPEN_BRACKET)
last_opened = i;
else if(a[i] == CLOSE_BRACKET){
first_closed = i;
break;
}
}
if(last_opened == -1)
return solve_easy(a, N);
else{
int b[me];
int ptr = 0;
for(int i = 1; i < last_opened; i ++)
b[++ptr] = a[i];
int subarray[me];
int sub_length = 0;
for(int i = last_opened + 1; i < first_closed; i ++)
subarray[++sub_length] = a[i];
b[++ptr] = solve_easy(subarray, sub_length);
for(int i = first_closed + 1; i <= N; i ++)
b[++ptr] = a[i];
return solve(b, ptr);
}
}
int main() {
//freopen("4.in", "r", stdin);
//freopen("4.out", "w", stdout);

int number = 0;
int str_length;
scanf("%s", s);
str_length = (int)strlen(s);
for(int i = 0; i < str_length; i ++){
if(s[i] == '(') a[++N] = OPEN_BRACKET;
else if(s[i] == ')'){
if(inside_number == 1){
a[++N] = number * sign;
sign = 1;
number = 0;
inside_number = 0;
}
a[++N] = CLOSE_BRACKET;
}
else if(is_operation(s[i], s, i, str_length)){
if(inside_number == 1){
a[++N] = number * sign;
sign = 1;
number = 0;
inside_number = 0;
}
if(s[i] == '+') a[++N] = PLUS;
else if(s[i] == '-') a[++N] = MINUS;
else if(s[i] == '*') a[++N] = MULTIPLY;
else if(s[i] == '/') a[++N] = DIVIDE;
}
else{
if(s[i] == '-')
sign = -1;
else number = 10 * number + s[i] - '0';
inside_number = 1;
}
}
if(s[str_length - 1] >= '0' && s[str_length - 1] <= '9')
a[++N] = number * sign;
//for(int i = 1; i <= N; i ++)
// printf("%d ---> %d\n", i, a[i]);

int output = solve(a, N);


printf("%d\n", output);

return 0;
}

/*
own cases:
2+3*(-1*10+4)
(4-2*(5-3)*4)
(4+(3*5))+(6*7)+8
(-2+4*(3+6-5))
-2+5+4-(0*4+5)
4*5+(6*4-75)*3
4-0*10+5*(7-2)
*/

Вам также может понравиться