#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define MAX_SIZE 100

int evaluate(char postfix[]);
void parse(char postfix[], 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 postfix[])
{
    int stack[MAX_SIZE];
    int top = -1;

    char token[MAX_SIZE];
    int i = 0;
    while(postfix[i]){
        parse(postfix, &i, token);
        if(isdigit(token[0])){
            int value = atoi(token);
            stack[++top] = value;
        }
        else{
            int op2 = stack[top--];
            int op1 = 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 postfix[], int *pos, char buffer[])
{
    int i = 0;
    while(postfix[*pos] == ' ')
        (*pos)++;

    if(isdigit(postfix[*pos])){
        while(isdigit(postfix[*pos]))
            buffer[i++] = postfix[(*pos)++];
        buffer[i] = '\0';
    }
    else
        buffer[0] = postfix[(*pos)++];
}
 

arrow
arrow
    全站熱搜

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