Стек: Калькулятор ОБЗ

VirchKS

Написать программу, получающую строку с некоторым выражением, записанным обратной бесскобочной записью и находящую его значение. Использование стека обязательно. Пример: 1 2 + ! 4 2 / 2 ^ - = 2.
#include <iostream>
#include <cstdlib>
#include <stack>
#include <cmath>
****** const pi=3.141592653589;
****** const e=2.718281828459;
std::stack<******>Stk;
int     F1(std::string mSt,int n);
void    F2(std::string mSt,std::string pkSl[],int n,int kSl);
******  F3(std::string pkSl[],int n,int kSl);
******  F4(std::string pkSl);
******  F5(char c);
******  F6(std::stack<******>Stk);//  +
******  F7(std::stack<******>Stk);//  -
******  F8(std::stack<******>Stk);//  *
******  F9(std::stack<******>Stk);//  /
****** F10(std::stack<******>Stk);//  !
int    F11(int a,int i);
****** F12(std::stack<******>Stk);//  ^
****** F13(std::stack<******>Stk);//  yroot
int main()
{
    std::string mSt;
    std::cout<<"..:";
    getline(std::cin,mSt);
    int n=mSt.size(),kSl=F1(mSt,n);
    std::string *pkSl=new std::string[kSl];
    F2(mSt,pkSl,n,kSl);
    system("cls");
    std::cout<<mSt<<" = "<<F3(pkSl,n,kSl);
    delete[] pkSl;
    return 0;
}
int F1(std::string mSt,int n)
{
    int kSl=1;
    for(int i=0;i<n;i++)
        if(mSt[i]==' ') kSl++;
    return kSl;
}
void F2(std::string mSt,std::string pkSl[],int n,int kSl)
{
    int j=-1,k=0;
    for(int i=0;i<n;i++)
    {
        if(mSt[i]==' ')
        {
            std::string pS(mSt,j+1,i-j-1);
            pkSl[k]=pS;
            k++;
            j=i;
        }
        else if(i+1==n)
        {
            std::string pS(mSt,j+1,i-j);
            pkSl[k]=pS;
            k++;
            j=i;
}   }   }
****** F3(std::string pkSl[],int n,int kSl)
{
    for(int i=0;i<kSl;i++)
             if(pkSl[i]=="+") {int q=F6(Stk);Stk.pop();Stk.pop();Stk.push(q);}
        else if(pkSl[i]=="-") {int q=F7(Stk);Stk.pop();Stk.pop();Stk.push(q);}
        else if(pkSl[i]=="*") {int q=F8(Stk);Stk.pop();Stk.pop();Stk.push(q);}
        else if(pkSl[i]=="/") {int q=F9(Stk);Stk.pop();Stk.pop();Stk.push(q);}
        else if(pkSl[i]=="!") {int q=F10(Stk);Stk.pop();Stk.push(q);}
        else if(pkSl[i]=="^") {int q=F12(Stk);Stk.pop();Stk.pop();Stk.push(q);}
        else if(pkSl[i]=="yroot") {int q=F13(Stk);Stk.pop();Stk.pop();Stk.push(q);}
        else if(pkSl[i]=="pi") Stk.push(pi);
        else if(pkSl[i]=="e") Stk.push(e);
        else Stk.push(F4(pkSl[i]));
    return Stk.top();
    Stk.pop();
}
****** F4(std::string pkSl)
{
    int n=pkSl.size();
    ****** bd=0.0,bi=0,k=1.0;
    bool b=false;
    for(int i=0;i<n;i++)
    {
        if((pkSl[0]=='-')and(pkSl!="-")) {k=-1.0;i++;}
        if((pkSl[i]==',')or(pkSl[i]=='.'))
        {
            b=true;
            i++;
        }
        if(b==false)
            bi=10*bi+F5(pkSl[i]);
        else
            bd=bd+F5(pkSl[i])/10;
    }
    return (bi+bd)*k;
}
****** F5(char c)
{
         if(c=='9')return 9;
    else if(c=='8')return 8;
    else if(c=='7')return 7;
    else if(c=='6')return 6;
    else if(c=='5')return 5;
    else if(c=='4')return 4;
    else if(c=='3')return 3;
    else if(c=='2')return 2;
    else if(c=='1')return 1;
    else if(c=='0')return 0;
}
****** F6(std::stack<******>Stk)
{
    ****** a=Stk.top();
    Stk.pop();
    ****** b=Stk.top();
    Stk.pop();
    return b+a;
}
****** F7(std::stack<******>Stk)
{
    ****** a=Stk.top();
    Stk.pop();
    ****** b=Stk.top();
    Stk.pop();
    return b-a;
}
****** F8(std::stack<******>Stk)
{
    ****** a=Stk.top();
    Stk.pop();
    ****** b=Stk.top();
    Stk.pop();
    return b*a;
}
****** F9(std::stack<******>Stk)
{
    ****** a=Stk.top();
    Stk.pop();
    ****** b=Stk.top();
    Stk.pop();
    return b/a;
}
****** F10(std::stack<******>Stk)
{
    ****** a=Stk.top();
    Stk.pop();
    return F11(round(a),1);
}
int F11(int a,int i)
{
    while(a!=0)
    {
        i=i*a;
        a--;
    }
    return i;
}
****** F12(std::stack<******>Stk)
{
    ****** a=Stk.top();
    Stk.pop();
    ****** b=Stk.top();
    Stk.pop();
    return pow(b,a);
}
****** F13(std::stack<******>Stk)
{
    ****** a=Stk.top();
    Stk.pop();
    ****** b=Stk.top();
    Stk.pop();
    return pow(b,1/a);
}
0 ответов