91 lines
1.6 KiB
C
91 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 stack[top--];
|
|
}
|
|
|
|
int isOperator(char c)
|
|
{
|
|
return (c == '+' || c == '-' || c == '*' || c == '/');
|
|
}
|
|
|
|
int isDigit(char c)
|
|
{
|
|
return (c >= '0' && c <= '9');
|
|
}
|
|
|
|
int evaluatePrefix(char *expr)
|
|
{
|
|
int len = strlen(expr);
|
|
for (int i = len - 1; i >= 0; i--)
|
|
{
|
|
if (isDigit(expr[i]))
|
|
{
|
|
push(expr[i] - '0');
|
|
}
|
|
else if (isOperator(expr[i]))
|
|
{
|
|
int operand1 = pop();
|
|
int operand2 = pop();
|
|
switch (expr[i])
|
|
{
|
|
case '+':
|
|
push(operand1 + operand2);
|
|
break;
|
|
case '-':
|
|
push(operand1 - operand2);
|
|
break;
|
|
case '*':
|
|
push(operand1 * operand2);
|
|
break;
|
|
case '/':
|
|
if (operand2 != 0)
|
|
push(operand1 / operand2);
|
|
else
|
|
{
|
|
printf("Error: Division by zero\n");
|
|
return -1;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return pop();
|
|
}
|
|
|
|
int main()
|
|
{
|
|
char expr[MAX_SIZE];
|
|
printf("Enter prefix expression: ");
|
|
gets(expr);
|
|
|
|
int result = evaluatePrefix(expr);
|
|
if (result != -1)
|
|
{
|
|
printf("Result: %d\n", result);
|
|
}
|
|
|
|
return 0;
|
|
} |