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