Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include "Stack.h"
- #include "DStack.h"
- #include <stdio.h>
- #include <iostream>
- #include <math.h>
- using namespace std;
- //--- naglowki funckji ---------
- double ONP();
- double Eval(char, double, double);
- double GetNum();
- char GetOper();
- void SkipSpaces();
- int prior( char cOper );
- int IsDigit( char c );
- int IsOper( char cOper );
- //=======================================
- int main( int argc, char* argv[] )
- {
- cout << "\nPodaj wyrazenie bez nawiasow: ";
- cout << "wartosc = " << ONP();
- cout << "\n\n";
- system("PAUSE");
- return 0;
- }
- //-----------------------
- double ONP()
- {
- char c;
- StackItem* pHead = NULL; // wyzerowanie stosu
- DStackItem* pDHead = NULL; // wyzerowanie stosu
- dpush( &pDHead, GetNum() );
- while (IsOper(c = GetOper()))
- {
- // prior operatora MUSI byc silnie wiekszy od prior szczytu stosu
- while (prior(c) <= prior(top(pHead))) // jeżeli wyższy priorytet to wyrzucam
- {
- double x = dpop(&pDHead);
- dpush(&pDHead, Eval(pop(&pHead), dpop(&pDHead), x));
- }
- push(&pHead, c);
- dpush(&pDHead, GetNum());
- }
- while( !isEmpty(pHead) )
- {
- double x = dpop(&pDHead);
- dpush(&pDHead, Eval(pop(&pHead), dpop(&pDHead), x));
- }
- return dpop(&pDHead);
- }
- //-----------------------
- double GetNum()
- {
- char c;
- double res = 0;
- SkipSpaces();
- while( IsDigit( c=getchar() ) )
- res = res * 10 + (c-'0');
- if (c == '.')
- {
- double coef = 0.1;
- while (IsDigit(c = getchar()))
- {
- res += coef * (c - '0');
- coef *= 0.1;
- }
- }
- ungetc( c, stdin );
- return res;
- }
- //-----------------------
- int IsDigit( char c )
- {
- return ( c>='0' ) && ( c<='9' );
- }
- //------------------------
- int IsOper( char cOper )
- {
- switch( cOper )
- {
- case '+':
- case '-':
- case '*':
- case '/':
- case '^':
- case '(':
- case ')': return 1;
- default: return 0;
- }
- }
- //------------------------
- char GetOper()
- {
- SkipSpaces();
- return getchar();
- }
- //------------------------
- void SkipSpaces()
- {
- char c;
- while( ( c = getchar() ) == ' ' );
- ungetc( c, stdin );
- }
- //------------------------
- int prior( char cOper )
- {
- switch( cOper )
- {
- case '(': return 1;
- case '+': ;
- case '-': return 2;
- case '*': ;
- case '/': return 3;
- case '^': return 4;
- }
- return 0;
- }
- double Eval(char cOper, double arg1, double arg2)
- {
- switch (cOper)
- {
- case '+': return arg1 + arg2;
- case '-': return arg1 - arg2;
- case '*': return arg1 * arg2;
- case '/': if (arg2 != 0)
- {
- return arg1 / arg2;
- }
- else
- {
- printf("%s,Nie można dzielić przez 0");
- return 0;
- }
- case '^': return pow(arg1, arg2);
- system("PAUSE");
- return 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement