Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include "Stack.h"
- using namespace std;
- #define DOT '.'
- //dodac nawiasy i liczby z przecinkami -> zrobione
- //dodac mozliwosc dzialania na wielu stosach -> sparametryzowac funkcje stosem ? -> do funkcji ONP trzeba dodać tworzenie prywatnego stosu
- /*
- ONP
- / \
- / \
- moduł operacje
- stosu sterujace
- do modułu stosu -> stock.h oraz stock.cpp !!! -> importowanie tych plików
- */
- //Kompilacja warunkowa przy wszystkich wydrukach!
- ///////////////////////////////////////////////////////
- //ONP funkcje
- void skipSpaces();
- double getNum();
- int isDigit(char c);
- int isOper(char c);
- char getOper();
- int prior(char cOper);
- void ONP();
- int main()
- {
- ONP();
- }
- void skipSpaces()
- {
- char c;
- while ( ( c = getchar() ) == ' ' );
- //musimy 'cofnac' sie o jeden znak bo jak trafi na inny niz spacja to go juz przeczyta, wiec cofamy
- ungetc(c, stdin);
- }
- double getNum()
- {
- char c;
- double num = 0;
- double partial = 0.1;
- //schemat Hornera
- skipSpaces();
- while(isDigit(c = getchar()))
- {
- num *= 10;
- num += ( (double)c - '0' );
- }
- //za kazdy kolejny ulamek partial musi zmniejszac sie 10^(-1) raza
- if( c == DOT )
- {
- while( isDigit( c = getchar() ) )
- {
- num += (( (double)c - '0' ) * partial);
- partial *= 0.1;
- }
- }
- ungetc(c, stdin);
- return num;
- }
- int isDigit(char c)
- {
- return ( c >= '0' ) && ( c <= '9' );
- }
- int isOper(char c)
- {
- switch (c)
- {
- case '+':
- case '-':
- case '*':
- case '^':
- case '(':
- case ')':
- case '/': return 1;
- }
- return 0;
- }
- char getOper()
- {
- skipSpaces();
- return getchar();
- }
- int prior(char cOper)
- {
- switch (cOper)
- {
- case ')': return 1;
- case '+':
- case '-': return 2;
- case '*':
- case '/': return 3;
- case '^': return 4;
- case '(': return 5;
- }
- return 0;
- }
- void ONP()
- {
- //tutaj cos nie dziala
- char c;
- skipSpaces();
- Stack* stack = createStack();
- //nie dziala jesli wyrazenie zaczyna sie od nawiasu
- printf("%.2f", getNum());
- while (isOper(c = getOper()))
- {
- while (prior(c) <= prior(top(&stack)))
- {
- //jezeli na gorze nawias otwierajacy to wyjdz z petli
- if ( prior(top(&stack)) == 5 )
- {
- //jezeli dodatkowo obecny znak to nawias zamykajacy, to usun nawias otwierajacy ze stosu
- if( prior( c ) == 1)
- del(&stack);
- break;
- }
- else
- printf(" %c", pop(&stack));
- }
- //kazdy operator poza nawiasem zamykajacym wpisuje sie na stos, zamykajacy ma wartosc 1
- if( prior( c ) > 1 )
- push(&stack, c);
- //jesli nastepny to liczba, to ja odczytaj
- //jezeli nastepny to nawias, to petla leci dalej
- if (isDigit(c = getchar()))
- {
- ungetc(c, stdin);
- printf(" %.2f", getNum());
- }
- else
- ungetc(c, stdin);
- }
- //wyczyscic stos -> pobrac pozostale operatory ze stosu
- while (!isEmpty(&stack)) {
- printf("%c", pop(&stack));
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement