使用堆栈来进行后缀的中缀

时间:2015-04-08 15:31:07

标签: c stack infix-notation

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "stack.h"

#define MAX_EQU_LEN 100

static int prec(char operator)
{
    switch (operator)
    {
        case '*':
            return 5;
        case '/':
            return 4;
        case '%':
            return 3;
        case '+':
            return 2;
        case '-':
            return 1;
        default:
            break;
    }

    return 0;
}

static int isNumeric(char* num)
{
    if(atoi(num) == 0)
    {
        return 0;
    }
            return 1;
}

char* infix_to_postfix(char* infix)
{
    char* postfix = malloc(MAX_EQU_LEN);
    stack* s = create_stack();
    s->size = strlen(infix);
    node* tempPtr = s->stack;
    unsigned int i;
    char symbol,next;
    char temp[2] = {0};

    for(i = 0; i < s->size ; i++)
    {
        symbol = *((infix + i));
        temp[0] = symbol;
        tempPtr = s->stack;
        if(isNumeric(temp) != 1)
        {
            strcat(postfix, temp);
        }
        else if(symbol == '(')
        {
            push(s, symbol);
        }
        else if(symbol == ')')
        {
            while(s->size != 0 && top(s) != '(')
            {
                next = tempPtr->data;
                temp[0] = next;
                pop(s);
                strcat(postfix, temp);
                tempPtr = s->stack;
                if(tempPtr->data == '(')
                {
                    pop(s);
                }
            }
        }
        else
        {
            while(s->size != 0 && prec(top(s)) > prec(symbol))
            {
                next = tempPtr->data;
                temp[0] = next;
                pop(s);
                strcat(postfix,temp);
                push(s,next);
            }
        }
        while(s->size != 0)
        {
            next = tempPtr->data;
            temp[0] = next;
            pop(s);
            strcat(postfix, temp);
        }
    }
    return postfix;

}

int evaluate_postfix(char* postfix) {

    //For each token in the string
        int i,result;
        int right, left;
        char ch;
        stack* s = create_stack();
        node* tempPtr = s->stack;

        for(i=0; i < strlen(postfix); i++){
            //if the token is numeric
            ch = postfix[i];
            if(isNumeric(&ch)){
                //convert it to an integer and push it onto the stack
                atoi(&ch);
                push(s, ch);
            }
            else
            {
                pop(&s[0]);
                pop(&s[1]);
                //apply the operation:
                //result = left op right
                       switch(ch)
                       {
                           case '+': push(&s[i],right + left);
                                     break;
                           case '-': push(&s[i],right - left);
                                     break;
                           case '*': push(&s[i],right * left);
                                     break;
                           case '/': push(&s[i],right / left);
                                     break;
                       }
                }
        }
        tempPtr = s->stack;
        //return the result from the stack
        return(tempPtr->data);

}        

此代码是更大程序的一部分,旨在将简单数学从中缀转换为后缀,然后对其进行评估。这将由一个堆栈来帮助保存数字和符号。但是,当我运行程序时,它会出现故障并且所有调试器都说它是在infix_to_postfix函数中,我无法弄清楚代码的哪一部分使它成为seg错误。

0 个答案:

没有答案