Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- struct element
- {
- int dane; //przechowuje dane stosu
- struct element *poprzedni; //wskaznik na poprzedni element
- };
- void push(struct element **gora, int wartosc) //funkcja dodwania do stsou
- {
- struct element *nowy;
- nowy = malloc(sizeof(struct element));
- nowy->dane = wartosc;
- nowy->poprzedni = *gora;
- *gora = nowy;
- }
- void pop(struct element **gora) // funkcja zdejmowania ze stosu
- {
- struct element *tymczasowy;
- tymczasowy = (*gora)->poprzedni;
- free(*gora);
- *gora = tymczasowy;
- }
- void full_print(struct element **gora) //drukuje wszystkie elementy stosu
- {
- struct element *tymczasowy;
- tymczasowy = *gora;
- while (pusty(&tymczasowy) != 0)
- {
- printf(" %d ", tymczasowy->dane);
- tymczasowy = tymczasowy->poprzedni;
- }
- }
- int pusty(struct element **gora) //sprawdza czy stos jest pusty (funkcja pomocniczna)
- {
- if (*gora == NULL)
- return 0;
- else
- return 1;
- }
- void empty(struct element **gora)//Drukuje informacje czy stos nie jest pusty
- {
- if (*gora == NULL)
- printf("Stos jest pusty \n");
- else
- printf("stos nie jest pusty \n");
- }
- void dodawanie(struct element **gora) //dodaje dwa elementy stosu do siebie
- {//postepowanie takie same jak opisano przy funkcji ilorazu
- int wynik;
- struct element *jedna, *druga;
- jedna=*gora;
- druga=(*gora)->poprzedni;
- wynik=jedna->dane + druga->dane;
- pop(gora);
- pop(gora);
- push(gora, wynik);
- }
- void roznica(struct element **gora) //odejmuje dwa elementy stosu od siebie
- {//postepowanie takie same jak opisano przy funkcji ilorazu
- int wynik;
- struct element *jedna, *druga;
- jedna=*gora;
- druga=(*gora)->poprzedni;
- wynik=jedna->dane - druga->dane;
- pop(gora);
- pop(gora);
- push(gora, wynik);
- }
- void iloczyn(struct element **gora) //mnozy dwa elementy stosu przez siebie
- {//postepowanie takie same jak opisano przy funkcji ilorazu
- int wynik;
- struct element *jedna, *druga;
- jedna=*gora;
- druga=(*gora)->poprzedni;
- wynik=jedna->dane * druga->dane;
- pop(gora);
- pop(gora);
- push(gora, wynik);
- }
- void iloraz(struct element **gora) // dzieli dwa elementy stosu przez sebie
- {
- int wynik; //zmienna przechowujaca wynik
- struct element *jedna, *druga; //struktury pomocnicze przechowujace liczby
- jedna=*gora;
- druga=(*gora)->poprzedni;
- wynik=jedna->dane / druga->dane; //wykonujemy dzialanie
- pop(gora); //usuwamy elementy na ktorych wykonujemy dzialanie
- pop(gora);
- push(gora, wynik); //dodajemy element do stosu przechowujacy wynik opercaji
- }
- void duplikuj(struct element **gora) // duplikuje element ze szczytu
- {
- int b;
- b=(*gora)->dane;
- push(gora, b);
- }
- void print(struct element **gora) // drukuje element ze szczytu
- {
- int d;
- d=(*gora)->dane;
- printf(" %d ", d);
- }
- int main()
- {
- int b;
- char a;
- struct element *gora = NULL;
- printf("\n Podawaj po kolei po spacjach liczby lub znaki dzialan (pierwsze dwa znaki musza byc liczba) \n");
- while ((a = getc(stdin)) != EOF)
- {
- if (a >= '0' && a <= '9')
- {
- ungetc(a,stdin);
- scanf("%d",&b);
- push(&gora, b);
- }
- if (a == '+') dodawanie(&gora);
- if (a == '-') roznica(&gora);
- if (a == '*') iloczyn(&gora);
- if (a == '/') iloraz(&gora);
- }
- print(&gora);
- printf("\n");
- }
- /*TO DO:
- * - Nie obsluguje liczb ujemnych i dwycyfrowych
- * - Brak obslugi bledow
- * *Dzielenie przez 0
- * *Operacja na liczbach mimo ze tylko jeden element jest na stosie
- * *Działania na pustym stosie (majac gotowa funkcje "pusty" mozna latwo dodac to)
- * *Wpisanie niedozwolonego znaku
- * - Majac gotowa funkcje "duplikuj" mozna latwo dodac potegowanie
- * - Poinformowanie jeżeli na stosie został więcej niż jeden element (co z założenia programu nie powinno sie zdarzyć)
- * - Zeby można bylo wykonywac obliczenia wiele razy bez koniecznsci ponownego wlaczania programu (trzeba tylko wtedy cały stos
- * ale mając funkcje "empty" i "pop" zaimplementowanie takiej nie bedzie specjalnie trudne
- * - Podzielić program na moduły
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement