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

#define MAX_SIZE 100

void infixToPostfix(char infix[]);
void parse(char infix[], int *pos, char buffer[]);

int isp(char symbol);
int icp(char symbol);

int main()
{
    char expression[] = "4 / 2 * (3+2-1) + (5-2)";
    infixToPostfix(expression);
    return 0;
}

void infixToPostfix(char infix[])
{
    char token[20];
    char stack[MAX_SIZE];
    int top = -1;

    int i = 0;
    while(infix[i] != '\0'){
        parse(infix, &i, token);

        if(isdigit(token[0]))
            printf("%s", token);
        else{
            if(token[0] == ')'){
                while(stack[top] != '(')
                    printf("%c", stack[top--]);
                top--;
            }
            else{
                while(top >= 0 && isp(stack[top]) >= icp(token[0]))
                    printf("%c", stack[top--]);
                stack[++top] = token[0];
            }
        }
    }

    while(top >= 0)
        printf("%c", stack[top--]);
    printf("\n");
}

void parse(char infix[], int *pos, char buffer[])
{
    int i = 0;
    while(infix[*pos] == ' ')
        (*pos)++;

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

int isp(char symbol)
{
    switch(symbol){
        case '(':
            return 1;
        case '+':
        case '-':
            return 2;
        case '*':
        case '/':
            return 3;

        default:
            printf("error occured! Unexpected symbol.\n");
            exit(1);
    }
}

int icp(char symbol)
{
    switch(symbol){
        case '(':
            return 10;
        case '+':
        case '-':
            return 2;
        case '*':
        case '/':
            return 3;

        default:
            printf("error occured! Unexpected symbol.\n");
            exit(1);
    }
}

arrow
arrow
    全站熱搜

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