#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX_SIZE 100
int evaluate(char prefix[]);
void parse(char prefix[], int *pos, char buffer[]);
int main()
{
char expression[] = "+ * / 4 2 - + 3 2 1 - 5 2";
printf("answer: %d\n", evaluate(expression));
return 0;
}
int evaluate(char prefix[])
{
int stack[MAX_SIZE];
int top = -1;
char token[MAX_SIZE];
int i = strlen(prefix) - 1;
while(i>=0){
parse(prefix, &i, token);
if(isdigit(token[0])){
int value = atoi(token);
stack[++top] = value;
}
else{
// Note order!!
int op1 = stack[top--];
int op2 = stack[top--];
switch(token[0]){
case '+':
op1 += op2;
break;
case '-':
op1 -= op2;
break;
case '*':
op1 *= op2;
break;
case '/':
op1 /= op2;
break;
default:
printf("error occured! can't resolve symbol %c\n", token[0]);
exit(1);
}
stack[++top] = op1;
}
}
return stack[0];
}
void parse(char prefix[], int *pos, char buffer[])
{
int i = 0;
while(prefix[*pos] == ' ')
(*pos)--;
if(isdigit(prefix[*pos])){
while(isdigit(prefix[*pos]))
buffer[i++] = prefix[(*pos)--];
buffer[i] = '\0';
i--;
for(int k = 0; k<i/2; k++){
buffer[k] ^= buffer[i-k];
buffer[i-k] ^= buffer[k];
buffer[k] ^= buffer[i-k];
}
}
else
buffer[0] = prefix[(*pos)--];
}