calculater by using reverse polish notation and using a stack
- by programmer
hello everyone I have a segmentation fault ,can you help please?
if i have this operater "3 5 +" that mean 3+5
and like "9 8 * 5 + 4 + sin", "sin(((9*8)+5)+4)"
so my idea is check if the first and second are numbers and push theem in the stack then when i have operator i pop the numbers and make the calculation then push the answer again.
`
typedef struct st_node {
float val;
struct st_node *next;
} t_node;
typedef t_node t_stack;
// a function to allocate memory for a stack and returns the stack
t_stack* fnewCell() {
t_stack* ret;
ret = (t_stack*) malloc(sizeof(t_stack));
return ret;
}
// a function to allocate memory for a stack, fills it with value v and pointer n , and returns the stack
t_stack* fnewCellFilled(float v, t_stack* n) {
t_stack* ret;
ret = fnewCell();
ret->val = v;
ret->next =n;
return ret;
}
//function to initialize stack
void initstack(t_stack** stack) {
fnewCellFilled(0,NULL);
}
// add new cell
void insrtHead(t_stack** head,float val) {
*head = fnewCellFilled(val,*head);
}
//function to push the value v into the stack s
void push(t_stack **s, float val) {
insrtHead(s,val);
}
//function to pop a value from the stack and returns it
int pop(t_stack **s) {
t_stack* tmp;
int ret;
tmp = (*s)->next;
ret = (*s)->val;
free(*s);
(*s) = tmp;
return ret;
}
int isempty (t_stack *t) {
return t == NULL;
}
//function to transfer a string(str) to int (value)
//returns -1 when success , i otherwise
int str2int(char *str,int *value) {
int i;
*value = 0;
int sign=(str[0]=='-' ? -1 : 1);
for(i=(str[0]=='-' ? 1 : 0);str[i]!=0;i++) {
if(!(str[i]>=48 && str[i]<=57)) // Ascii char 0 to 9
return i;
*value= *value*10+(str[i]-48);
}
*value = *value * sign;
return -1;
}
//a function that takes a string, transfer it into integer and make operation using a stack
void function(t_stack *stack, char *str)
{
char x[10]=" ";
int y,j,i=0,z;
printf("++\n");
if(str[i] != '\0') {
strcpy(x, strtok(str, " "));
z= str2int(x, &y);
if(z == -1)
{
push(&stack,y);
i=i+2;
}
}
while(str[i] != '\0')
{
strcpy(x, strtok(NULL, " "));
z= str2int(x, &y);
if(z == -1)
{
printf("yes %d",y);
push(&stack,y);
i=i+2;
}
else
{
y=pop(&stack);
j=pop(&stack);
if(x[0] == '+' ) push(&stack,y+j);
else if (x[0] == '-' ) push(&stack,j-y);
else if(x[0] == '*' ) push(&stack,j*y);
else if(x[0] == '/') push (&stack ,j/y);
}
}
}
int main() {
t_stack *s;
initstack(&s);
char *str="3 5 +";
function(s,str);
return 0;
}
`