我试图编写一个计算器,将中缀表达式转换为后缀表达式,然后计算后缀表达式。我已经把我的代码放在这里供你参考
我的后缀代码工作得非常好,因为我已经自己测试过了。但是,当我在中缀文件中使用后缀代码进行计算时,就会出现分段错误
我曾尝试使用gdb调试segfaults,它将我指向后缀文件中的is_operand()函数。我回溯查看它是如何到达那个函数的,我注意到当我的中缀程序调用postfix_evaluate函数时,它调用了这个is_operand()函数,这给了我这个错误。我不知道如何解决这个问题,因为我对C代码比较陌生。谢谢你的帮助
我的中缀.c文件:
“包括”;中缀.h“;
//计算存储为字符串标记数组的表达式
双计算中缀表达式(字符**args,整数nargs){
//在这里编写代码
char**postfix=malloc(sizeof(char*)*nargs);
后缀=inftopost(args,nargs);
整数计数=0;
对于(int i=0;i<;nargs;i++){
如果(是左括号(*(args+i))){
计数++;
}
}
int infix_size=nargs-计数;
double final=计算后缀表达式(后缀、中缀大小);
返回最终结果;
}
//--------------------------------------------------------
字符**inftopost(字符**args,int nargs){
char**postfix=malloc(sizeof(char*)*nargs);
结构双栈*中缀=双栈新(nargs);
int计数器=0;
对于(int i=0;i<;nargs;i++){
if(是_操作数(args[i])){
后缀[counter]=args[i];
计数器++;
}
else if(是开括号(args[i])){
双栈推(中缀“(”);
}
else if(is_运算符(args[i])){
while(op_优先级(中缀,*args[i],中缀)){
char flag3=双栈(中缀);
后缀[计数器]=flag3;
计数器++;
}
双栈推送(中缀,*args[i]);
}
else if(is_closedbracket(args[i])){
int标志;
而(!is_openbracket_stack(中缀,args)){
char flag=双栈弹出(中缀);
后缀[计数器]=标志;
计数器++;
}
双栈流行(中缀);
}
}
int-top=infix->;项[infix->;top-1];
int flag2;
while(is_运算符(args[top])){
int-top=infix->;项[infix->;top-1];
char flag2=双栈(中缀);
后缀[计数器]=flag2;
计数器++;
}
返回后缀;
}
bool是openbracket(char*token){
如果(令牌[0]=='('){
返回true;
}
返回false;
}
bool is_closedbracket(字符*标记){
如果(令牌[0]==')'){
返回true;
}
返回false;
}
bool是openbracket堆栈(结构双堆栈*输入,字符**中缀){
int top=输入->;项[输入->;top-1];
如果(中缀[top][0]=='('){
返回true;
}
返回false;
}
布尔运算优先(结构双栈*输入,字符**中缀,字符*令牌){
int top=输入->;项[输入->;top-1];
int top_stack_优先级=0;
if(中缀[top][0]='^'){
顶层堆栈优先级=4;
}如果((中缀[top][0]='*')| |(中缀[top][0]=='/')){
顶层堆栈优先级=3;
}else if((中缀[top][0]='+')| |(中缀[top][0]='-')){
顶层堆栈优先级=2;
}
int-token_优先级=0;
如果(令牌[0]=='^'){
令牌_优先级=4;
}else if((令牌[0]='*')| |(令牌[0]=='/')){
令牌_优先级=3;
}else if((令牌[0]='+')| |(令牌[0]='-')){
令牌_优先级=2;
}
if(标记优先权>;=顶部堆栈优先权){
返回true;
}
返回false;
}
我的postfix.c文件:
”包括“postfix.h”;
布尔是_运算符(字符*令牌){
如果(令牌[0]='+'| |令牌[0]='-'| |令牌[0]='X'| |令牌[0]='/'| |令牌[0]='^'){
返回true;
}
返回false;
}
bool是_操作数(字符*标记){
如果(令牌[0]>;='0'&;&;令牌[0]<;='9'){
返回true;
}如果((令牌[0]='-'| |令牌[0]='.)&;(*(令牌+1)<;='9'&;*(令牌+1)>;='0')){
返回true;
}
返回false;
}
//计算存储为字符串标记数组的表达式
双值后缀表达式(字符**args,int nargs){
//在这里编写代码
struct double_stack*stack=double_stack_new(nargs);
对于(int i=0;i<;nargs;i++){
if(is_操作数(*(args+i))){
双栈推送(栈,atof(*(args+i));
}
else if(is_运算符(args[i])){
双令牌,op1,op2;
op2=双_堆栈_pop(堆栈);
op1=双_堆栈_pop(堆栈);
字符运算符_check=args[i][0];
开关(操作员检查){
格“+”:
令牌=op2+op1;
双栈推送(栈、令牌);
打破
案例'-':
令牌=op1-op2;
双栈推送(栈、令牌);
打破
案例“X”:
令牌=op1*op2;
双栈推送(栈、令牌);
打破
案例“/”:
令牌=op1/op2;
双栈推送(栈、令牌);
打破
案例‘^’:
令牌=pow(op1,op2);
双栈推送(栈、令牌);
打破
默认:中断;
}
}
}
返回双_堆栈_pop(堆栈);
}
我没有在这里包括我的.h文件,但我有所有必要的headerfile和其他必要的东西
malloc(nargs*sizeof(char*))为指针数组分配空间,它不会为这些指针中的任何一个分配空间。在尝试索引到这些字符串之前,需要对数组的每个元素执行类似于postfix[i]=malloc(…*sizeof(char))的操作- 将
postfix分配给malloc的结果后,不应重新分配它(在postfix=inftopost(args,nargs)行上执行此操作)。这会导致“丢弃”malloc的结果
作为一般指导,您应该尝试在初始化函数中仅使用malloc和free。例如,您可以编写函数create\u stack和destroy\u stack。然后所有其他堆栈方法将堆栈作为第一个参数,并对该堆栈执行一些操作(弹出、推动等)
如果您想在C语言中对程序设计进行更详细的阐述,请留下评论