#include #include #include #include #include #define STACK_SIZE 10 struct stack { float values[STACK_SIZE]; int size; }; // Function declarations void push_stack(struct stack* stack, float value); float pop_stack(struct stack* stack); void print_stack(struct stack* stack); int is_number(const char* str); int main() { struct stack mystack; memset(&mystack, 0, sizeof(struct stack)); // Initialize the stack char input[50]; while (1) { printf("Enter a number or an operator (+, -, *, /): "); if (!fgets(input, sizeof(input), stdin)) { break; // Exit on EOF } // Remove trailing newline character input[strcspn(input, "\n")] = 0; // Check if the input is empty if (strlen(input) == 0) { printf("no input\n"); break; } if (is_number(input)) { // Convert input to float and push onto stack float value = atof(input); push_stack(&mystack, value); } else if (strlen(input) == 1 && strchr("+-*/", input[0])) { // Perform operation if (mystack.size < 2) { fprintf(stderr, "Error: Not enough values in stack.\n"); exit(EXIT_FAILURE); } float b = pop_stack(&mystack); float a = pop_stack(&mystack); float result; switch (input[0]) { case '+': result = a + b; break; case '-': result = a - b; break; case '*': result = a * b; break; case '/': if (b == 0) { fprintf(stderr, "Error: Division by zero.\n"); exit(EXIT_FAILURE); } result = a / b; break; default: fprintf(stderr, "Error: Invalid operator.\n"); exit(EXIT_FAILURE); } push_stack(&mystack, result); } else { fprintf(stderr, "Error: Invalid input.\n"); exit(EXIT_FAILURE); } // Print the current stack print_stack(&mystack); } return 0; } // Push a value onto the stack void push_stack(struct stack* stack, float value) { assert(stack->size < STACK_SIZE); // Ensure there's space in the stack stack->values[stack->size] = value; stack->size += 1; } // Pop a value from the stack float pop_stack(struct stack* stack) { assert(stack->size > 0); // Ensure there's something to pop stack->size -= 1; return stack->values[stack->size]; } // Print the contents of the stack void print_stack(struct stack* stack) { for (int i = 0; i < stack->size; i++) { printf("%.2f ", stack->values[i]); } printf("\n"); } // Check if the input string is a valid number int is_number(const char* str) { char* endptr; strtod(str, &endptr); return *endptr == '\0' && endptr != str; }