【发布时间】:2018-07-07 18:18:25
【问题描述】:
中缀到前缀 - 首先将中缀的反转转换为后缀,然后 反转结果以获取前缀。
但是问题在于后缀表达式的反转。我怀疑问题在于使用指针。我尝试用其他方式倒车,它奏效了。
但我似乎无法理解为什么会出现问题。
输出:
c*b+a //给定中缀表达式的逆向
cb*a+ //反转中缀表达式的后缀
+a*a+ //前缀:问题
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*
Method declarations
....
*/
void main()
{
char infix[] = "a+b*c";
char* reverse = rev(exp);
printf("%s\n", reverse);
char* postfix = inToPost(reverse);
printf("%s\n", postfix);
char* prefix= rev(postfix);
printf("%s", prefix);
}
char* rev(char* ptr1)
{
char rev[strlen(ptr1)+1];
char *temp = ptr1;
int i =0;
while(*ptr1!='\0')
{
ptr1++;
}
do
{
rev[i++] = *--ptr1;
}while(ptr1!=temp);
rev[i] = '\0';
ptr1 = rev;
return ptr1;
}
char* inToPost(char *ptr)
{
char post[strlen(ptr)+1];
int i =0;
while(*ptr!='\0')
{
char ch = *ptr;
if(isOperand(ch))
{
post[i++]=ch;
//printf("%c",ch);
}
else if(isOperator(ch))
{
while(!isEmpty() && !isOpenP(peek()) && getPrec(peek())>=getPrec(ch))
{
post[i++]=peek();
//printf("%c", peek());
pop();
}
push(ch);
}
else if(isOpenP(ch))
{
push(ch);
}
else if(isCloseP(ch))
{
while(!isEmpty() && !isOpenP(peek()))
{
post[i++]=peek();
//printf("%c", peek());
pop();
}
pop();
}
ptr++;
}
while(!isEmpty())
{
post[i++]=peek();
//printf("%c", peek());
pop();
}
post[i] = '\0';
ptr = post;
return ptr;
}
/*
Method definitions
*/
【问题讨论】:
-
这不是您的直接问题,但请注意
void main()仅在 Windows 上可接受(在广泛使用的平台中)。有关肮脏的详细信息,请参阅What shouldmain()return in C and C++。 -
糟糕的代码,3倍太长了,这是Ctrc/CtrlV几次尝试?答案错误不是唯一的。代码中的注释建议 OOP,数十个不需要的分配 ... UB ...
-
你到底想说什么?!我是一个初学者,我不想用这段代码找到工作或任何东西,把它写得整洁而专业。如果你以前用指针解决过,那是很容易理解的。不要无缘无故地粗鲁。
-
对初学者的建议。以简短清晰的步骤完成工作。执行并测试倒车功能(几行),仅此而已,如果测试良好,请继续下一步。在一次大尝试中不可能在未经检查的(事实上的错误)代码上构建下一层是徒劳的