我正在尝试制作一个使用RPN的程序,该程序将计算一系列整数。我有一些无法更改的标准功能(pop
,push
)。但是,当我运行下面的代码时,出现了分段错误。
由于我无法更改这两个函数的内部核心,因此我尝试更改调用它们的方式(我将stack[]
设为动态数组,将top
设为int指针),但没有任何变化。
#include <stdio.h>
#include <stdlib.h>
#define N 1000
void push(int stack[],int *t,int obj)
{
if((*t)==(N-1))
{
printf("Stack overflow...\n");
getchar(); //getc
abort();
}
else
stack[++(*t)]=obj;
}
int pop(int stack[],int *t)
{
int r;
if((*t<0))
{
printf("Stack empty...\n");
printf("Error in expresion.\n");
getchar(); //getc
abort();
}
else
r=stack[(*t)--];
return(r);
}
int isdigit(char in)
{
int flag;
if (in>=48 && in<=57) //if its terminus
flag=1;
else if(in==42 || in==43 || in==45 || in==47) //if its operator
flag=2;
else
flag=0;
return flag;
}
int main(int argc, char** argv) {
int *stack=(int*) malloc(N*sizeof(int));
char input;
int i=0,*top=0,flag;
int num1,num2;
float result;
if (stack == NULL) {
printf("Out of memory!\n");
return (1);
}
printf("Give the Formula: ");
while(input=getchar())
{
flag=isdigit(input);
if(flag==1) //if its terminus
{
push(&stack[i],top,input);
}
if(flag==2) //if its enforcer
{
num1=pop(&stack[i],top);
num2=pop(&stack[i+1],top);
if (input==42) //case of +
result=num1+num2;
if (input==43) //case of *
result=num1*num2;
if (input==45) //case of -
result=num2-num1;
if (input==47) //case of /
if(num2!=0)
result=num2/num1;
else
printf("Can't do the operation");
push(&stack[i],top,result);
}
if(flag==0) //case of everything else
{
printf("Error");
exit(1);
}
printf("Operand: %c\n",input);
// for(int j=0;j<strlen(stack);j++)
// printf("stack[%d]=%d\n",i,stack[j]);
//printf current status of stack
i++;
}
return (EXIT_SUCCESS);
}
如果您有一系列像234+*
这样的整数,则堆栈应该首先是2,3,4,+,*
,其次是5,4,*
,然后是20
。
答案 0 :(得分:1)
在main
中,您将top
定义为指针,并将其初始化为指向null。
之后,在push
中,您尝试通过*t
取消引用空位置。在这里您会遇到细分错误。