C++

Калькулятор. Обратная польская нотация.

Вот пост на хабре с помощью которого это написал.
http://habrahabr.ru/post/100869/
#include <iostream>
#include <string>
#include <vector>
#include <math.h>

using namespace std;

int p(char c){ //определяется приоритет знака
    if (c=='=')
        return 0;
    if ((c=='(') || (c==')'))
        return 1;
    if (((c>='0') && (c<='9')) || (c=='.'))
        return 2;
    if ((c=='+') || (c=='-'))
        return 3;
    if ((c=='*') || (c=='/'))
        return 4;
    if (c=='^')
        return 5;
}

long double calk(string s){
    vector<long double> b;
    string pol, st="=";
    int l=s.size();
    long double e=1;
    bool fl=false;
    for (int i=0;i<l;i++){ //записываем выражение в обратной польской нотации 
        if (p(s[i])==2){
            if (fl==false){
                pol=pol+' '+s[i];
                fl=true;
            }
            else
                pol+=s[i];
        }
        else
        {
            fl=false;
            if ((s[i]==')') && (st[st.size()-1]=='('))
                st.resize(st.size()-1);
            else{
                if ((p(s[i])>p(st[st.size()-1])) || (s[i]=='('))
                    st+=s[i];
                else{
                    pol+=st[st.size()-1];
                    st.resize(st.size()-1);
                    i--;
                }
            }
        }
    }
    for (int i=st.size()-1;i>0;i--)
        pol+=st[i];
    for (int i=0;i<pol.size();i++){ //считаем
        switch (pol[i]){
            case ' ' :
                b.push_back(0);
                e=1;
                break;
            case '.' :
                e=10;
                break;
            case '+' :
                b[b.size()-2]=b[b.size()-2]+b[b.size()-1];
                b.pop_back();
                break;
            case '-' :
                b[b.size()-2]=b[b.size()-2]-b[b.size()-1];
                b.pop_back();
                break;
            case '*' :
                b[b.size()-2]=b[b.size()-2]*b[b.size()-1];
                b.pop_back();
                break;
            case '^' :
                b[b.size()-2]=pow(b[b.size()-2],b[b.size()-1]);
                b.pop_back();
                break;
            case '/' :
                if (b[b.size()-1]==0){
                    cout<<"Division by zero";
                    return 0;
                }
                b[b.size()-2]=b[b.size()-2]/b[b.size()-1];
                b.pop_back();
                break;
            default :
                b[b.size()-1]=b[b.size()-1]*(e==1 ? 10 : 1)+(pol[i]-48)/e;
                if (e!=1)
                    e*=10;
                break;
        }
    }
    return b[0];
}

int main(){
    string s;
    while (1){
        cin>>s;
        cout<<calk(s)<<"\n";
    }
    return 0;
}
Добавлено: 05 Мая 2014 03:21:01 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...