来自C中的程序(中缀符号 - >后缀表示法)的错误答案

时间:2017-05-24 11:55:12

标签: c stack

我制作了一个程序,使用C语言中的堆栈将中缀符号更改为后缀表示法。

我创建了一个打印后缀表示法结果的函数(来自中缀notaton)。

但是,符号的结果是错误的。这应该是' 195'但其结果是' -61'。

其他符号的结果是正确的,但只有符号(op2)有这个问题。

我该怎么做才能解决这个问题?

这是我的代码:

typedef char element;

typedef struct {
    element stack[MAX_STACK_SIZE];
    int top;
} StackType;


void init(StackType *s) {
    s->top = -1;
}

int is_empty(StackType *s) {
    return (s->top == -1);
}

int is_full(StackType *s) {
    return (s->top == (MAX_STACK_SIZE - 1));
}


void push(StackType *s, element item) {
    if (is_full(s)) {
        fprintf(stderr, "FULL STACK ERROR\n");
        return;
    }
    else s->stack[++(s->top)] = item;
}

element pop(StackType *s) {
    if (is_empty(s)) {
        fprintf(stderr, "EMPTY STACK ERROR\n");
        exit(1);
    }
    else return s->stack[(s->top)--];
}


int eval(char exp[]) {
    int op1, op2, value, i = 0;
    int len = strlen(exp);
    char ch;
    StackType s;
    init(&s);
    for (i = 0; i < len; i++) {
        ch = exp[i];
        if (ch != '+' && ch != '-' && ch != '*' && ch != '/') {
            value = ch - '0';        
            push(&s, value);
        }
        else {                          
            op2 = pop(&s);
            op1 = pop(&s);
            switch (ch) {            
            case '+': push(&s, op1 + op2); break;
            case '-': push(&s, op1 - op2); break;
            case '*': push(&s, op1 * op2); break;
            case '/': push(&s, op1 / op2); break;
            }
        }
    }
    return pop(&s);
}

char* infix_to_postfix(char exp[]) {
    int i = 0, j = 0;
    char ch, top_op;
    int len = strlen(exp);
    char *ex = (char *)malloc(sizeof(char)*(len + 1));
    StackType s;

    init(&s);
    for (i = 0; i < len; i++) {
        ch = exp[i];
        switch (ch) {
        case '+': case '-': case '*': case '/': 
            while (!is_empty(&s) && (prec(ch) <= prec(peek(&s)))) {
                ex[j++] = pop(&s);
            }
            push(&s, ch);
            break;
        case '(':       
            push(&s, ch);
            break;
        case ')':       
            top_op = pop(&s);
            while (top_op != '(') {
                ex[j++] = top_op;
                top_op = pop(&s);
            }
            break;
        default:
            ex[j++] = ch;
            break;
        }
    }
    while (!is_empty(&s)) {
        ex[j++] = pop(&s);
    }
    ex[j] = NULL;           
    return ex;
}

void main() {
    char *op1 = "(9-(3+2))*3+4*((4+2)/3)-1";
    char *op2 = "(4*5-3)/3+((2+5*7)-8+9)*5";          
    char *op3 = "7*3-7-4+1/3+6-8*2";
    char *pos1, *pos2, *pos3;

    pos1 = infix_to_postfix(op1);
    pos2 = infix_to_postfix(op2);
    pos3 = infix_to_postfix(op3);

    printf(" Result : %d\n", eval(pos1));
    printf(" Result : %d\n", eval(pos2));
    printf(" Result : %d\n", eval(pos3));
}

[结果]

  

结果:1​​9

     

结果:-61 //这应该是&#39; 195&#39;。

     

结果:0

1 个答案:

答案 0 :(得分:3)

线索是61+195 = 256。这意味着在某个地方,您的计算被保存到字符中。看起来像element

typedef element int;