Pushok icon

stack calc

Pushok | PRO | 08/02/11 05:06:04 PM UTC | 0 ⭐ | 380 👁️ | Never ⏰ | []
C++ |

2.09 KB

|

None

|

0 👍

/

0 👎

#include <iostream>
#include <string>
 
using namespace std;
 
class PStack
{
public:
 
    PStack();
 
    void parse( char* expression );
 
    bool isoper( std::string str );
    bool isfloat( char* );
    void push( double val );
    void docalc( std::string oper );
 
    double gettop();
 
private:
 
    double Stk[100];
    double *It;
    int opers_num;
    const char** valid_opers;// = { "+", "-", "*", "/", "^" };
 
};
 
bool PStack::isfloat( char* str )
{
    char* ch = str;
 
    do 
    {
        
        if( *ch != '.' )
        {
            if( *ch > '9' || *ch < '0')
            {
                return false;
            }
        }
 
    } while ( *(++ch) );
 
    return true;
}
 
bool PStack::isoper( std::string str )
{
    for(int i = 0; i < 5; i++)
    {
        if( str == valid_opers[i] )
        {
            return true;
        }
    }
 
    return false;
}
 
 
 
void PStack::parse( char* expression )
{
    char* pch = strtok(expression, " ");
 
    do 
    {
 
        if( !isoper( pch ) )
        {
            if( isfloat( pch ) )
            {
                this->push(atof(pch));
            }
            else
            {
                printf( "ERROR TYPE\n" );
 
                return;
            }
        }
        else
        {
            this->docalc( pch );
        }
 
    } while (pch = strtok( NULL, " "));
}
 
PStack::PStack()
{
    It = Stk;
    opers_num = 5;
    valid_opers = (const char**)malloc( sizeof( char* ) * opers_num);
 
    valid_opers[0] = "+";
    valid_opers[1] = "-";
    valid_opers[2] = "*";
    valid_opers[3] = "/";
    valid_opers[4] = "^";
}
 
void PStack::push( double val )
{
    *It++ = val;
}
 
void PStack::docalc( std::string oper )
{
    if( It - 2 >= Stk)
    {
        double vals[2] = {*(It-2), *(It-1)};
 
        It -= 2;
 
        if( oper == "+" )
        {
            this->push( vals[0] + vals[1] );
        }
        else if (oper == "-")
        {
            this->push( vals[0] - vals[1] );
        }
        else if (oper == "*")
        {
            this->push( vals[0] * vals[1] );
        }
        else if (oper == "/")
        {
            this->push( vals[0] / vals[1] );
        }
        else if (oper == "^")
        {
            this->push( pow(vals[0], vals[1]) );
        }
    }
}
 
double PStack::gettop()
{
    return *( It - 1 );
 
    return 0;
}
 
int main()
{
    PStack ps;
    char ch[] = "1.0 2.0 1.0 + + 2.0 *";
    ps.parse(ch);
 
    printf("%f", ps.gettop());
    getchar();
}

Comments