#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#define MAX 100
#define EMPTY -1
struct stack
{
int data[MAX];
int top;
};
int isempty(struct stack *s)
{
return (s->top == EMPTY) ? 1 : 0;
}
void emptystack(struct stack* s)
{
s->top = EMPTY;
}
void push(struct stack* s,int item)
{
if(s->top == (MAX-1))
{
printf("\nSTACK FULL");
}
else
{
++s->top;
s->data[s->top]=item;
}
}
int pop(struct stack* s)
{
int ret=EMPTY;
if(s->top != EMPTY)
{
ret= s->data[s->top];
--s->top;
}
return ret;
}
void display(struct stack s)
{
while(s.top != EMPTY)
{
printf("\n%d",s.data[s.top]);
s.top--;
}
}
int isoperator(char e)
{
if(e == '+' || e == '-' || e == '*' || e == '/' || e == '%')
return 1;
else
return 0;
}
int priority(char e)
{
int pri = 0;
if(e == '*' || e == '/' || e =='%')
pri = 2;
else
{
if(e == '+' || e == '-')
pri = 1;
}
return pri;
}
int evaluate(char *postfix)
{
char *p;
struct stack stk;
int op1,op2,result;
emptystack(&stk);
p = &postfix[0];
while(*p != '\0')
{
/* removes tabs and spaces */
while(*p == ' ' || *p == '\t' )
{
p++;
}
if(*p == '\0')
break;
/* if is digit */
if(isdigit(*p))
{
push(&stk,*p - 48);
}
else
{
/* it is an operator */
op1 = pop(&stk);
op2 = pop(&stk);
switch(*p)
{
case '+':
result = op2 + op1;
break;
case '-':
result = op2 - op1;
break;
case '/':
result = op2 / op1;
break;
case '*':
result = op2 * op1;
break;
case '%':
result = op2 % op1;
break;
default:
printf("\nInvalid Operator");
return 0;
}
push(&stk,result);
}
p++;
}
result = pop(&stk);
return result;
}
void infix2postfix(char* infix, char * postfix, int insertspace)
{
char *i,*p;
struct stack X;
char n1;
emptystack(&X);
i = &infix[0];
p = &postfix[0];
while(*i)
{
while(*i == ' ' || *i == '\t')
{
i++;
}
if( isdigit(*i) || isalpha(*i) )
{
while( isdigit(*i) || isalpha(*i))
{
*p = *i;
p++;
i++;
}
/*SPACE CODE*/
if(insertspace)
{
*p = ' ';
p++;
}
/*END SPACE CODE*/
}
if( *i == '(' )
{
push(&X,*i);
i++;
}
if( *i == ')')
{
n1 = pop(&X);
while( n1 != '(' )
{
*p = n1;
p++;
/*SPACE CODE*/
if(insertspace)
{
*p = ' ';
p++;
}
/*END SPACE CODE*/
n1 = pop(&X);
}
i++;
}
if( isoperator(*i) )
{
if(isempty(&X))
push(&X,*i);
else
{
n1 = pop(&X);
while(priority(n1) >= priority(*i))
{
*p = n1;
p++;
/*SPACE CODE*/
if(insertspace)
{
*p = ' ';
p++;
}
/*END SPACE CODE*/
n1 = pop(&X);
}
if(n1!=-1)
push(&X,n1);
push(&X,*i);
}
i++;
}
}
while(!isempty(&X))
{
n1 = pop(&X);
*p = n1;
p++;
/*SPACE CODE*/
if(insertspace)
{
*p = ' ';
p++;
}
/*END SPACE CODE*/
}
*p = '\0';
}
int main(void)
{
char infix[MAX], postfix[MAX], choice, option;
printf("\t\tMISSION-RIVERA's CALCULATOR PROGRAM!");
printf("\n\nDo you want to use our calculator program?<Y/N>");
scanf("%c",&option);
if(option=='y' || option=='Y')
{
do
{
clrscr();
printf("Enter expression: ");
fflush(stdin);
gets(infix);
infix2postfix(&infix[0],&postfix[0],1);
printf("\n\nPostfix expression is: %s",&postfix[0]);
printf("\n\n\t\tThe answer to this expression %s is %d.",&infix[0],evaluate(&postfix[0]));
printf("\n\nDo you want to continue?<Y/N>");
scanf("%c",&choice);
}while(choice=='y' || choice=='Y');
printf("\n\t\t\tTHANK YOU FOR USING!!!");
printf("\n\nPress any key to exit!");
getch();
}
else
{
printf("\n\t\t\tTHANK YOU FOR USING!!!");
printf("\n\nPress any key to exit!");
getch();
}
return 0;
}
| |
|
Welcome to KnowledgeSutra - Dear Guest | |
Plz Help! It Doesn't Evaluate Right When I Use 2-digit Or More Numbers Starting From 10....only 1-digit Numbers!
Started by vIp3rS, Mar 10 2010 01:11 PM
No replies to this topic
#1
Posted 10 March 2010 - 01:11 PM
Reply to this topic

1 user(s) are reading this topic
0 members, 1 guests, 0 anonymous users













