用C++实现中缀表达式求值即简单科学计算器的功能

来源:互联网 发布:mac视频字幕制作软件 编辑:程序博客网 时间:2024/06/06 10:57

用两个栈实现计算机加减乘除简易的计算器,一个栈乘数字,一个栈乘加减乘除号包括括号,通过出栈入栈来实现功能

#include <iostream>#include <string>using namespace std;template <class T>class myStack{private:    T *elements;    int top;    int maxSize;public:    myStack(int maxSize)    {        elements = new T[maxSize];        this->maxSize = maxSize;        top = -1;    }    bool isFull()    {        if(top==maxSize-1) return true;        else return false;    }    bool isEmpty()    {        if(top== -1) return true;        else return false;    }    T pop()    {        if(isEmpty())return -1;        else        {            top--;            return elements[top+1];        }    }    bool push(T x)    {        if(isFull()) return false;        else        {            top++;            elements[top] = x;            return true;        }    }    int getSize()    {        return top+1;    }    T getTop()    {        return elements[top];    }};int calculate(int a,int b,int c){    switch(c)    {    case '+':        return a+b;    case '-':        return a-b;    case '*':        return a*b;    case '/':        return a/b;    default:        return 0;    }}char compare(char a1,char a2){    if(a1=='+'&&a2=='+')return '>';    else if(a1=='+'&&a2=='-') return '>';    else if(a1=='+'&&a2=='*') return '<';    else if(a1=='+'&&a2=='/')return '<';    else if(a1=='+'&&a2=='(')return '<';    else if(a1=='+'&&a2==')')return '>';    else if(a1=='+'&&a2=='#')return '>';    else if(a1=='-'&&a2=='+')return '>';    else if(a1=='-'&&a2=='-')return '>';    else if(a1=='-'&&a2=='*')return '<';    else if(a1=='-'&&a2=='/')return '<';    else if(a1=='-'&&a2=='(')return '<';    else if(a1=='-'&&a2==')')return '>';    else if(a1=='-'&&a2=='#')return '>';    else if(a1=='*'&&a2=='+')return '>';    else if(a1=='*'&&a2=='-')return '>';    else if(a1=='*'&&a2=='*')return '>';    else if(a1=='*'&&a2=='/')return '>';    else if(a1=='*'&&a2=='(')return '<';    else if(a1=='*'&&a2==')')return '>';    else if(a1=='*'&&a2=='#')return '>';    else if(a1=='/'&&a2=='+')return '>';    else if(a1=='/'&&a2=='-')return '>';    else if(a1=='/'&&a2=='*')return '>';    else if(a1=='/'&&a2=='/')return '>';    else if(a1=='/'&&a2=='(')return '<';    else if(a1=='/'&&a2==')')return '>';    else if(a1=='/'&&a2=='#')return '>';    else if(a1=='('&&a2=='+')return '<';    else if(a1=='('&&a2=='-')return '<';    else if(a1=='('&&a2=='*')return '<';    else if(a1=='('&&a2=='/')return '<';    else if(a1=='('&&a2=='(')return '<';    else if(a1=='('&&a2==')')return '=';    else if(a1==')'&&a2=='+')return '>';    else if(a1==')'&&a2=='-')return '>';    else if(a1==')'&&a2=='*')return '>';    else if(a1==')'&&a2=='/')return '>';    else if(a1==')'&&a2==')')return '>';    else if(a1==')'&&a2=='#')return '>';    else if(a1=='#'&&a2=='+')return '<';    else if(a1=='#'&&a2=='-')return '<';    else if(a1=='#'&&a2=='*')return '<';    else if(a1=='#'&&a2=='/')return '<';    else if(a1=='#'&&a2=='(')return '<';    else if(a1=='#'&&a2=='#')return '=';    else return ' ';}bool isChar(char c){    if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')return true;    else return false;}int EvaluateExpression(string expression){    int result;    myStack<int> *numStack = new myStack<int>(100);    myStack<char> *charStack = new myStack<char>(100);    charStack->push('#');    int i= 0;    while(i<expression.length())    {        int temp=0;        bool flag = false;        while(expression[i]>='0' &&expression[i]<='9')        {            temp = temp*10+expression[i]-'0';            i++;            flag = true;        }        if(flag==true)        {            flag = false;            numStack->push(temp);        }        if(isChar(expression[i]))        {            switch(compare(charStack->getTop(),expression[i]))            {            case '<':                charStack->push(expression[i]);                i++;                break;            case '=':                charStack->pop();                i++;                break;            case '>':                int a = numStack->pop();                int b = numStack->pop();                char c = charStack->pop();                result= calculate(b,a,c);                numStack->push(result);                break;            }        }    }    return numStack->pop();}int main(){    string a;    for(;;)    {        cout<<"[0]退出程序\n[1]计算表达式"<<endl;        int i;        cin>>i;        if(i==0)break;        else        {            cout<<"请输入要表达的计算式"<<endl;            cin>>a;            a+='#';            cout<<EvaluateExpression(a)<<endl;        }    }    return 0;}


 

1 0
原创粉丝点击