66 lines
1.6 KiB
C
66 lines
1.6 KiB
C
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#define MAX_SIZE 100
|
||
|
|
||
|
int stack[MAX_SIZE];
|
||
|
int top = -1;
|
||
|
|
||
|
void push(int item) {
|
||
|
if (top >= MAX_SIZE - 1) {
|
||
|
printf("Stack Overflow\n");
|
||
|
return;
|
||
|
}
|
||
|
stack[++top] = item;
|
||
|
}
|
||
|
|
||
|
int pop() {
|
||
|
if (top < 0) {
|
||
|
printf("Stack Underflow\n");
|
||
|
return -1; // Return a sentinel value instead of exiting
|
||
|
}
|
||
|
return stack[top--];
|
||
|
}
|
||
|
|
||
|
int isDigit(char c) {
|
||
|
return c >= '0' && c <= '9';
|
||
|
}
|
||
|
|
||
|
int evaluatePostfix(char* exp) {
|
||
|
int i, operand1, operand2, result;
|
||
|
|
||
|
for (i = 0; exp[i] != '\0'; i++) {
|
||
|
if (isDigit(exp[i])) {
|
||
|
push(exp[i] - '0');
|
||
|
} else {
|
||
|
operand2 = pop();
|
||
|
operand1 = pop();
|
||
|
switch (exp[i]) {
|
||
|
case '+': push(operand1 + operand2); break;
|
||
|
case '-': push(operand1 - operand2); break;
|
||
|
case '*': push(operand1 * operand2); break;
|
||
|
case '/':
|
||
|
if (operand2 == 0) {
|
||
|
printf("Error: Division by zero\n");
|
||
|
return -1; // Return a sentinel value instead of exiting
|
||
|
}
|
||
|
push(operand1 / operand2);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return pop();
|
||
|
}
|
||
|
|
||
|
int main() {
|
||
|
char exp[MAX_SIZE];
|
||
|
printf("Enter a postfix expression: ");
|
||
|
fgets(exp, MAX_SIZE, stdin);
|
||
|
exp[strcspn(exp, "\n")] = 0; // Remove newline if present
|
||
|
|
||
|
int result = evaluatePostfix(exp);
|
||
|
if (result != -1) {
|
||
|
printf("Result: %d\n", result);
|
||
|
}
|
||
|
return 0;
|
||
|
}
|