#include
#include
#include
#include
#define MAX 100
typedef struct {
int data[MAX];
int top;
} Stack;
void init(Stack *s) {
s->top = -1;
}
int isFull(Stack *s) {
return s->top == MAX - 1;
}
int isEmpty(Stack *s) {
return s->top == -1;
}
void push(Stack *s, int value) {
if (isFull(s)) {
printf("Stack overflown");
exit(1);
}
s->data[++(s->top)] = value;
}
int pop(Stack *s) {
if (isEmpty(s)) {
printf("Stack underflown");
exit(1);
}
return s->data[(s->top)--];
}
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int multiply(int a, int b) {
return a * b;
}
int divide(int a, int b) {
if (b == 0) {
printf("Error: Division by zeron");
exit(1);
}
return a / b;
}
void parseInput(const char *input, Stack *values, Stack *operators) {
int i = 0;
while (input[i] != '') {
if (isdigit(input[i])) {
int num = 0;
while (isdigit(input[i])) {
num = num * 10 + (input[i] - '0');
i++;
}
push(values, num);
} else if (input[i] == '+' || input[i] == '-' || input[i] == '*' || input[i] == '/') {
push(operators, input[i]);
i++;
} else {
i++;
}
}
}
void checkInput(const char *input) {
int i = 0;
while (input[i] != '') {
if (!isdigit(input[i]) && input[i] != '+' && input[i] != '-' && input[i] != '*' && input[i] != '/') {
printf("Error: Invalid character '%c'n", input[i]);
exit(1);
}
i++;
}
}
int calculate(Stack *values, Stack *operators) {
while (!isEmpty(operators)) {
int b = pop(values);
int a = pop(values);
char op = pop(operators);
int result;
switch (op) {
case '+':
result = add(a, b);
break;
case '-':
result = subtract(a, b);
break;
case '*':
result = multiply(a, b);
break;
case '/':
result = divide(a, b);
break;
default:
printf("Error: Invalid operator '%c'n", op);
exit(1);
}
push(values, result);
}
return pop(values);
}
int main() {
char input[MAX];
Stack values, operators;
init(&values);
init(&operators);
printf("Enter an expression: ");
fgets(input, MAX, stdin);
input[strcspn(input, "n")] = '';
checkInput(input);
parseInput(input, &values, &operators);
int result = calculate(&values, &operators);
printf("Result: %dn", result);
return 0;
}