111 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <assert.h>
 | 
						|
 | 
						|
#define STACK_SIZE 10
 | 
						|
 | 
						|
// Stack structure
 | 
						|
struct stack {
 | 
						|
    float values[STACK_SIZE];
 | 
						|
    int size;
 | 
						|
};
 | 
						|
 | 
						|
// Function to print the stack
 | 
						|
void print_stack(struct stack* s) {
 | 
						|
    for (int i = 0; i < s->size; i++) {
 | 
						|
        printf("%.2f", s->values[i]);
 | 
						|
        if (i < s->size - 1) {
 | 
						|
            printf(" ");  // Print space between values
 | 
						|
        }
 | 
						|
    }
 | 
						|
    printf("\n");
 | 
						|
}
 | 
						|
 | 
						|
// Function to push a value onto the stack
 | 
						|
void push_stack(struct stack* s, float value) {
 | 
						|
    if (s->size >= STACK_SIZE) {
 | 
						|
        printf("Chyba: zasobnik je plny\n");
 | 
						|
        exit(1);
 | 
						|
    }
 | 
						|
    s->values[s->size++] = value;
 | 
						|
}
 | 
						|
 | 
						|
// Function to pop a value from the stack
 | 
						|
float pop_stack(struct stack* s) {
 | 
						|
    if (s->size == 0) {
 | 
						|
        printf("Chyba: zasobnik je prazdny\n");
 | 
						|
        exit(1);
 | 
						|
    }
 | 
						|
    return s->values[--s->size];
 | 
						|
}
 | 
						|
 | 
						|
// Check if input is an operator
 | 
						|
int is_operator(char* input) {
 | 
						|
    return (strcmp(input, "+") == 0 || strcmp(input, "-") == 0 ||
 | 
						|
            strcmp(input, "*") == 0 || strcmp(input, "/") == 0);
 | 
						|
}
 | 
						|
 | 
						|
// Perform the operation on the top of the stack
 | 
						|
void perform_operation(struct stack* s, char* operator) {
 | 
						|
    if (s->size < 2) {
 | 
						|
        printf("Chyba: nedostatok operandov\n");
 | 
						|
        exit(1);
 | 
						|
    }
 | 
						|
 | 
						|
    float b = pop_stack(s);
 | 
						|
    float a = pop_stack(s);
 | 
						|
    float result;
 | 
						|
 | 
						|
    if (strcmp(operator, "+") == 0) {
 | 
						|
        result = a + b;
 | 
						|
    } else if (strcmp(operator, "-") == 0) {
 | 
						|
        result = a - b;
 | 
						|
    } else if (strcmp(operator, "*") == 0) {
 | 
						|
        result = a * b;
 | 
						|
    } else if (strcmp(operator, "/") == 0) {
 | 
						|
        if (b == 0) {
 | 
						|
            printf("Chyba: delenie nulou\n");
 | 
						|
            exit(1);
 | 
						|
        }
 | 
						|
        result = a / b;
 | 
						|
    } else {
 | 
						|
        printf("Chyba: neplatna operacia\n");
 | 
						|
        exit(1);
 | 
						|
    }
 | 
						|
 | 
						|
    push_stack(s, result);
 | 
						|
}
 | 
						|
 | 
						|
int main() {
 | 
						|
    char input[100];
 | 
						|
    struct stack mystack;
 | 
						|
    mystack.size = 0;
 | 
						|
 | 
						|
    // Reading input from stdin until EOF or an error occurs
 | 
						|
    while (fgets(input, sizeof(input), stdin) != NULL) {
 | 
						|
        input[strlen(input) - 1] = '\0'; // Remove newline character
 | 
						|
 | 
						|
        // Try to parse input as a number
 | 
						|
        float value;
 | 
						|
        if (sscanf(input, "%f", &value) == 1) {
 | 
						|
            push_stack(&mystack, value);
 | 
						|
        }
 | 
						|
        // If it's not a number, check if it's a valid operator
 | 
						|
        else if (is_operator(input)) {
 | 
						|
            perform_operation(&mystack, input);
 | 
						|
        }
 | 
						|
        // Invalid input
 | 
						|
        else {
 | 
						|
            printf("Chyba: neplatny vstup\n");
 | 
						|
            return 1;
 | 
						|
        }
 | 
						|
 | 
						|
        // Print stack after each valid input
 | 
						|
        print_stack(&mystack);
 | 
						|
    }
 | 
						|
 | 
						|
    printf("no input\n");
 | 
						|
    return 0;
 | 
						|
}
 |