问题描述
这是我的第一个问题,请原谅非技术语言
我正在制作一个将中缀转换为前缀和后缀的程序。我将中缀添加到正在工作的 postfix。现在,当我想中缀前缀时,我们需要反转表达式。所以我想从相反的方向读取中缀。
while(*e != '\0')
{
if(isalpha(*e))
printf("%c ",*e);
else if(*e == '(')
push(*e);
else if(*e == ')')
{
while((x = pop()) != '(')
printf("%c ",x);
}
else
{
while(priority(stack[top]) >= priority(*e))
printf("%c ",pop());
push(*e);
}
e++;
}
以上是后缀中缀的一部分,其中 e
是扫描字符串的指针。在 pre 的中缀中,我计划将 e++ 替换为 e--
但是在第一行中,我们看到它直接打印字符,所以我需要反转方向
例如。
一
巴
+ba
解决方法
首先,欢迎来到stackoverflow。 (我也是新来的。)
实际上,您的标题并没有完全描述您的需求:也就是说,“反向写作”不足以实现您的目标。
考虑输入中缀表达式 a + b * c
。您已完成将其转换为后缀为 a b c * +
的子任务(假设 *
的优先级高于 +
)。正确的前缀转换为 + a * b c
。请注意,这与后缀结果的反转不同(即,它不是 + * c b a
)。总而言之,前缀表达式不仅仅是后缀表达式的反转。
那么,我将如何解决您的任务?我会创建一个包含三个组件的系统。第一个组件处理您的输入并生成一个简单的“解析树”,其图形表示为:
+
/ \
a *
/ \
b c
这个的主要数据结构是一个“解析树节点”,看起来像这样:
struct Node {
Node* leftChild;
Node* rightChild;
char symbol;
};
第二个组件从此解析树转换为后缀表达式(实现与您原始帖子所做的相同)。
第三个组件从此解析树转换为前缀表达式。这样做只是一个递归过程(给定一个特定节点,首先输出该节点的符号,然后递归应用于左侧,然后递归应用于右侧)。如果您需要有关如何执行此操作的进一步指导,请告诉我。