/* Program to evaluate a postfixed expression entered by the user */ /* 71gh73n3d by 5kull_m4c1n705h */ #include #include #include #include #define MAX 40 struct Stack { int top; int ele[MAX]; }; typedef struct Stack lifo; void Push(lifo *t, int ch) { if (t -> top == MAX) printf("\nERR: Stack overflow."); else t -> ele[++t -> top] = ch; } int Pop(lifo *t) { if (t -> top == -1) printf("\nERR: Stack underflow."); else return (t -> ele[t -> top--]); } int Peep(lifo *t) /* returns top element from stack without removing it */ { return (t -> ele[t -> top]); } int Rank(char ch) { if ((ch == '+') || (ch == '-') || (ch == '*') || (ch == '/') || (ch == '$')) return -1; else return 1; } float EvalPostfix(lifo *t, char *exp) { float op1, op2, value; while (*exp) { if ((*exp == ' ') || (*exp == '\t')) exp++; if (isdigit(*exp)) Push(t, *exp - '0'); /* typecasts symbol to numeral */ else { op2 = Pop(t); op1 = Pop(t); switch (*exp) { case '+': value = op1 + op2; break; case '-': value = op1 - op2; break; case '*': value = op1 * op2; break; case '/': value = op1 / op2; break; case '$': value = pow(op1, op2); break; } Push(t, value); } exp++; } return (Pop(t)); } main() { char postfix[MAX]; int rank; lifo *stack; int i; float result; clrscr(); stack -> top = -1; /* stack initialized */ printf("Enter the postfix expression : "); scanf("%s", postfix); rank = 0; /* a prefix or postfix expression is valid iff rank is 1 */ for (i = 0; i < strlen(postfix); i++) rank = rank + Rank(*(postfix + i)); if (rank != 1) { printf("\nInvalid postfix expression."); printf("\n\nProgram over. Press any key to exit..."); getch(); exit(-1); } result = EvalPostfix(stack, postfix); printf("The result of the expression is : %f", result); printf("\n\nProgram over. Press any key to exit..."); getch(); }