C语言中后缀到中缀符号的转换

zzoitvuj  于 2023-05-06  发布在  其他
关注(0)|答案(1)|浏览(211)

我在C中从后缀转换为中缀时遇到问题。我知道问题出在哪里,但我不知道怎么解决。

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

struct Stack {
    int *T;
    int top;
    int capacity;
};

void dobracket(char *T, int end) {
    for (int i = end - 1; i >= 0; i--)
        T[i+1] = T[i];
    T[0] = '(';
    T[end+1] = ')';
    T[end+2] = '\0';
}

// ab+c-def^^*g/
char *postfix_to_infix(char *postfix) {
    int pos = 0;
    struct Stack Mystack;
    init_stack(&Mystack, 20);

    char *infix = (char *)malloc(sizeof(char) * strlen(postfix));
    for (int i = 0; postfix[i] != '\0'; i++) {
        if (isdigit(postfix[i]) || isalpha(postfix[i]))
            push(&Mystack, postfix[i]);
        else if (Mystack.top > 0) {
            char second = pop(&Mystack);
            char first = pop(&Mystack);
            infix[pos++] = first;
            infix[pos++] = postfix[i];
            infix[pos++] = second;
            dobracket(infix, pos);
            pos = pos + 2;
        }
        else {
            infix[pos++] = postfix[i];
            infix[pos++] = pop(&Mystack);
            dobracket(infix, pos);
            pos = pos + 2;
        }
    }
    infix[pos] = '\0';
    return infix;
}

#include <stdio.h>

int main(void) {
    char *p = postfix_to_infix("83-2*53/+");
    fputs(p,stdout);
    return 0;
}

我知道我会到达((((8-3)*2),然后它会放5/3)+。之后它会尝试弹出一个空堆栈,但我不知道如何做到这一点。错误是什么?
我试着把后缀符号83-2*53/+转换成中缀。我以为是(((8-3)*2) +(5/3))。结果为空((((8-3)*2)5/3)+�)

plicqrtu

plicqrtu1#

首先,您的malloc()还不够大。中缀符号加上括号,可以使长度加倍。
第二,当你有一个在堆栈上没有任何内容的操作符时,你就不是在处理这种情况。而且你的条件句也不适用于这些情况。在第一种情况下,当你做两个pop()时,你需要if (Mystack.top >= 2)。下一个有一个pop()的不应该只是else,而是else if (Mystack.top >= 1)。然后需要第三种情况,最后一个else,当前缺失,为空堆栈。
第三,你的方法不会起作用,因为你正在失去子表达式的踪迹。在编写任何代码之前,您需要重新考虑这种方法,并在您的测试用例上对其进行建模。

相关问题