Help needed here please!!!!!!
Please can someone assist me, this code is meant to evaluate a postfix expression, but it not working for negative digits. something like 2 -5 - i.e for 2-(-5)=7.
Code:
#include<stdio.h>
#include<stdlib.h>
#define MAXCOLS 80
int main()
{
char instring[MAXCOLS], postring[MAXCOLS];
int position = 0;
float eval();
float result;
printf("%s", "Enter postfix expression with space as delimiter: ");
while ((postring[position++] = getchar()) != '\n');
postring[--position] = '\0';
printf("%s%s", "postfix expression is", postring);
getchar();
result=eval(postring);
printf("%s%f\n", "value is", result);
getchar();
}
struct stack{
int top;
float items[MAXCOLS];
};
float eval(expr)
char expr[];
{
int c, position;
float op1, op2, value;
float oper(), pop();
struct stack opndstk;
opndstk.top = -1;
for (position =0; (c=expr[position]) != '\0'; position++)
if(c==' ')
{
}
else
if(isdigit(c)){
int sign;
double val, power,res;
sign = (expr[position] == '-') ? -1 : 1;
for (val = 0.0; isdigit(expr[position]); position++)
val = 10.0 * val + (expr[position] - '0');
if (expr[position] == '.')
{
position++;
}
else
{
}
for (power = 1.0; isdigit(expr[position]); position++)
{
val = 10.0 * val + (expr[position] - '0');
power *= 10;
}
res= sign * val / power;
push(&opndstk, res);
}
else {
op2 = pop(&opndstk);
op1 = pop(&opndstk);
value = oper(c, op1, op2);
push (&opndstk, value);
}
return (pop(&opndstk));
}
float oper(symb, operand1, operand2)
int symb;
float operand1, operand2;
{
switch(symb){
case '+': return (operand1 + operand2);
case '-': return (operand1 - operand2);
case '*': return (operand1 * operand2);
case '/': return (operand1 / operand2);
default: printf("%s", "illegal operation");
exit(1);
}
}
push(ps, x)
struct stack *ps;
float x;
{
if(ps->top == MAXCOLS-1)
{
printf("%s", "stack overflow");
exit(1);
}
else
ps->items[++(ps->top)] =x;
return;
}
float pop(ps)
struct stack *ps;
{
if (ps->top==-1)
{
printf("%s", "stack underflow");
exit(1);
}
else
return(ps->items[ps->top--]);
}