Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <limits.h>
- #include <string.h>
- #include <stdlib.h>
- using namespace std;
- #define MAX_PAMAT 40
- enum stav_zasobnika {
- OK = -1, FULL = INT_MAX, EMPTY = INT_MIN
- };
- typedef struct {
- int citatel, menovatel;
- }Zlomok;
- typedef struct {
- Zlomok pamat[MAX_PAMAT];
- int vrchol;
- }LIFO;
- stav_zasobnika isFull(LIFO & zasobnik) {
- if (zasobnik.vrchol == 0) {
- return FULL;
- }
- return OK;
- }
- Zlomok pop(LIFO & zasobnik) {
- if (zasobnik.vrchol > 0) {
- return zasobnik.pamat[--zasobnik.vrchol];
- } else {
- return zasobnik.pamat[0];
- }
- }
- stav_zasobnika push(LIFO & zasobnik, Zlomok x) {
- if (zasobnik.vrchol < MAX_PAMAT)
- zasobnik.pamat[zasobnik.vrchol++] = x;
- else
- return FULL;
- return OK;
- }
- Zlomok add(Zlomok a, Zlomok b) {
- Zlomok c;
- a.menovatel *= b.menovatel;
- b.menovatel *= b.menovatel;
- a.citatel *= b.menovatel;
- b.citatel *= a.menovatel;
- c.citatel = a.citatel + b.citatel;
- c.menovatel = a.menovatel;
- return c;
- }
- Zlomok substaction(Zlomok a, Zlomok b) {
- Zlomok c;
- a.menovatel *= b.menovatel;
- b.menovatel *= b.menovatel;
- a.citatel *= b.menovatel;
- b.citatel *= a.menovatel;
- c.citatel = a.citatel - b.citatel;
- c.menovatel = a.menovatel;
- return c;
- }
- Zlomok vynas(Zlomok a, Zlomok b) {
- Zlomok c;
- c.menovatel = a.menovatel * b.menovatel;
- c.citatel = a.citatel * b.citatel;
- }
- Zlomok div(Zlomok a, Zlomok b) {
- Zlomok c;
- c.menovatel = b.citatel * a.menovatel;
- c.citatel = b.menovatel * a.citatel;
- }
- int main() {
- LIFO f;
- f.vrchol = 0;
- Zlomok x;
- int i, j, N;
- Zlomok a, b;
- char vyraz[40], buffer[20];
- cin.getline(vyraz, 39);
- N = (int) strlen(vyraz);
- for (i = 0; i < N; i++) {
- if (vyraz[i] == ' ') {
- continue;
- }
- if (vyraz[i] == '+') {
- a = pop(f);
- b = pop(f);
- return push(f, add(a, b));
- continue;
- }
- if (vyraz[i] == '*') {
- a = pop(f);
- b = pop(f);
- return push(f, vynas(a, b));
- continue;
- }
- if (vyraz[i] == '/') {
- a = pop(f);
- b = pop(f);
- return push(f, div(a, b));
- continue;
- }
- if (vyraz[i] == '-') {
- a = pop(f);
- b = pop(f);
- return push(f, substaction(a, b));
- continue;
- }
- j = 0;
- x.citatel = 0;
- x.menovatel = 1;
- while ((vyraz[i] >= '0' && vyraz[i] <= '9')) {
- buffer[j] = vyraz[i];
- i++;
- j++;
- }
- buffer[j] = 0;
- x.citatel = atoi(buffer);
- if (vyraz[i] == '|') {
- i++;
- j = 0;
- while ((vyraz[i] >= '0' && vyraz[i] <= '9')) {
- buffer[j] = vyraz[i];
- i++;
- j++;
- }
- buffer[j]=0;
- x.menovatel = atoi(buffer);
- }
- if (FULL == push(f, x)) {
- cout << "LIFO overflow";
- break;
- }
- }
- x = pop(f);
- cout<< x.citatel<<"|"<<x.menovatel;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement