数据结构 简易计算器

来源:互联网 发布:ant编译java代码 编辑:程序博客网 时间:2024/05/22 12:51

主要解决了处理负数、小数等的基础运算操作,无图形界面

#include <iostream>#include <stack>using namespace std;class Calculator{private:    int Priority(char fuhao);    double CalSuffix(string PostfixExp);public:    double Calculate(string InfixExp);      string InfixToSuffix(string InfixExp);};double Calculator::CalSuffix(string PostfixExp){    double tmpresult,ch1,ch2;    double tmpnum,tmpxiaoshu=1;    int i=0,tmpdashu;    int isfu=0;  ///    stack<double> stk2;    while(PostfixExp[i]!='\0'){        isfu=0;  ///        if(PostfixExp[i]>=48&&PostfixExp[i]<=57){            if(PostfixExp[i-1]=='-'){     /////                isfu=1;            }            tmpxiaoshu=1;            tmpdashu=10;            tmpnum = PostfixExp[i]-48;            while(PostfixExp[++i]>=48&&PostfixExp[i]<=57){                tmpnum = tmpnum*tmpdashu+ (PostfixExp[i]-48);            }            i=i-1;            if(PostfixExp[++i]=='.'){                while(PostfixExp[++i]>=48&&PostfixExp[i]<=57){                    tmpxiaoshu=tmpxiaoshu*0.1;                    tmpnum = tmpnum + (PostfixExp[i]-48)*tmpxiaoshu;                }                i=i-1;            }            else{                i=i-1;            }            if(isfu){   ////                tmpnum=tmpnum*(-1);            }            stk2.push(tmpnum);        }        else if(PostfixExp[i]=='&'||PostfixExp[i]==' '){        }        else {            if(PostfixExp[++i]>=48&&PostfixExp[i]<=57){                i=i-1;            }            else {                i=i-1;                ch2 = stk2.top();                stk2.pop();                ch1 = stk2.top();                stk2.pop();                switch(PostfixExp[i]){                    case '+': tmpnum = ch1 + ch2; break;                    case '-': tmpnum = ch1 - ch2;  break;                    case '*': tmpnum = ch1 * ch2; break;                    case '/': tmpnum = ch1 / ch2;                        if(ch2==0) cout<<"除数为零";break;                }                stk2.push(tmpnum);            }        }        i++;    }    if(stk2.empty()!=1){      tmpresult = stk2.top();      stk2.pop();    }    return tmpresult;}double Calculator::Calculate(string InfixExp){    double result;    result = CalSuffix(InfixToSuffix(InfixExp));    return result;}int Calculator::Priority(char fuhao){    switch(fuhao){        case '+':        case '-': return 2;        case '*':        case '/': return 3;        case '(':        case ')': return 1;        default:            return 0;    }}string Calculator::InfixToSuffix(string InfixExp){    stack<char> stk;    string PostfixExp = "                  ";    int i=0,j=0;    char tmpfuhao;    int flag = 0;  //判断多位数的头数是否为零    while(InfixExp[i]!='\0'){        if(InfixExp[i]>=48&&InfixExp[i]<=57){            flag = 0;            PostfixExp[j++]='&';            PostfixExp[j++]=InfixExp[i];            if(InfixExp[i]=='0'){                flag = 1;            }            while(InfixExp[++i]>=48&&InfixExp[i]<=57){                if(flag==0)                    PostfixExp[j++]=InfixExp[i];                else                    cout<<"输入错误数字";            }            i=i-1;            if(InfixExp[++i]=='.'){                PostfixExp[j++]='.';                while(InfixExp[++i]>=48&&InfixExp[i]<=57){                    PostfixExp[j++]=InfixExp[i];                }                i=i-1;            }            else{                i=i-1;            }        }        else if(InfixExp[i]=='('){            stk.push(InfixExp[i]);        }        else if(InfixExp[i]==')'){            if(stk.empty()){               cout<<"表达式错误!";            }            else{               tmpfuhao = stk.top();               while(tmpfuhao!='('){                   if(stk.empty()){                       cout<<"表达式错误!";                   }                   else{                       PostfixExp[j++] = '&';                       PostfixExp[j++] = tmpfuhao;                       stk.pop();                       tmpfuhao = stk.top();                   }                }                stk.pop();            }        }        else if(InfixExp[i]=='+'||InfixExp[i]=='-'||InfixExp[i]=='*'||InfixExp[i]=='/'){            if(i==0||((InfixExp[--i]<48||InfixExp[i]>57)&&InfixExp[i]!=')')){                i++;                PostfixExp[j++]='&';                PostfixExp[j++]='-';                while(InfixExp[++i]>=48&&InfixExp[i]<=57){                    PostfixExp[j++]=InfixExp[i];                }                i=i-1;                if(InfixExp[++i]=='.'){                    PostfixExp[j++]='.';                    while(InfixExp[++i]>=48&&InfixExp[i]<=57){                        PostfixExp[j++]=InfixExp[i];                    }                    i=i-1;                }                else{                    i=i-1;                }            }            else{                i++;            if(stk.empty()){                stk.push(InfixExp[i]);            }            else{                tmpfuhao = stk.top();                if(Priority(tmpfuhao)<Priority(InfixExp[i])){                    stk.push(InfixExp[i]);                }                else{                    while(Priority(tmpfuhao)>=Priority(InfixExp[i])){                        PostfixExp[j++] = '&';                        PostfixExp[j++] = tmpfuhao;                        stk.pop();                        if(stk.empty()!=1){                           tmpfuhao = stk.top();                        }                        else break;                    }                    stk.push(InfixExp[i]);                }            }            }        }        else{            cout<<"符号错误!";            break;        }        i++;    }    while(!stk.empty()){        tmpfuhao = stk.top();        PostfixExp[j++] = '&';        PostfixExp[j++] = tmpfuhao;        stk.pop();    }    PostfixExp[j++] = '\0';    return PostfixExp;}int main(int argc, const char * argv[]) {    string a;    Calculator a1;    cin>>a;    cout<<a1.Calculate(a)<<endl;   cout<<a1.InfixToSuffix(a);    return 0;}