#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)--];
}
 

arrow
arrow
    全站熱搜

    大神(偽) 發表在 痞客邦 留言(0) 人氣()