天天看點

利用棧寫的一個支援四則運算的電腦

#include<iostream>

#include<stack>

#include<cstdio>

#include<cstdlib>

using namespace std;

const int ERROR=0;

int In(char,char *);

int evaluate(void);

char Procede(char ,char );

int operate(int,char,int);

template<typename T>

T pop(stack<T>& a)

{

    T temp=a.top();

    a.pop();

    return temp;

}

char OP[]={'+','-','*','/','(',')','#','\0'};

//Driver

int main(void)

{

    cout<<"Here is a calculator based on stack!\n";

    int result;

    cout<<">>>";

    while(cin.peek()!='q')//cin.peek only look at the next char from the stdin,but not read it from the stream.

    {

        result=evaluate();

        cout<<">>>"<<result<<"\n>>>";

    }

    cout<<"Done!\n";

    return 0;

}

//function

int evaluate(void)

{

    stack<int> OPND;//opnd stack 

    stack<char> OPTR;//operator stack 

    OPTR.push('#');

    char c;

    char theta,x;

    int a,b;

    cin>>c;//get a char from input 

    while(c!='#' || OPTR.top()!='#')

    {

        if(!In(c,OP)){

            c=c-'0';//transform the c into int type 

            OPND.push(c);//if c is not a OPTR element,then push it into the  OPND;

        cin>>c;

        }

        else {

            switch(Procede(OPTR.top(),c))//compare the OPTR top with the c

            {

                case '<'://if priority less than top 

                    OPTR.push(c);

                    cin>>c;

                    break;

                case '=':

                    x=pop(OPTR);

                    cin>>c;

                    break;

                case '>':

                    theta=pop(OPTR);

                    a=pop(OPND);

                    b=pop(OPND);

                    OPND.push(operate(a,theta,b));

                    break;

                default:

                    cout<<"Error!\n";

                    break;

            }//switch

        }//else 

    }//while

    return OPND.top();

}//evaluate

int In(char c,char *OP)

{

    char *temp;

    for(temp=OP;*temp!='\0';temp++)

    {

        if(*temp==c)

            return 1;

    }

    return 0;

}

int operate(int a,char theta,int b)

{

    switch(theta)

    {

        case '+':

            return b+a;break;

        case '-':

            return b-a;break;

        case '*':

            return b*a;break;

        case '/':

            return b/a;break;

        default: return ERROR;

    }

}

char Procede(char a,char b)

{

    switch(a){

       case '+':

        {

            switch(b)

            {

                case '+':return '>';break;

                case '-':return '>';break;

                case '*':return '<';break;

                case '/':return '<';break;

                case ')':return '>';break;

                case '(':return '<';break;

                case '#':return '>';break;

            }

            break;

        }

        case '-':

        { 

            switch(b)

            {

                case '+':return '>';break;

                case '-':return '<';break;

                case '*':return '<';break;

                case '/':return '<';break;

                case '(':return '<';break;

                case ')':return '>';break;

                case '#':return '>';break;

            }

            break;

        }

        case '*':

        { 

            switch(b)

            {

                case '+':return '>';break;

                case '-':return '>';break;

                case '*':return '>';break;

                case '/':return '>';break;

                case '(':return '<';break;

                case ')':return '>';break;

                case '#':return '>';break;

            }

            break;

        }

        case '/':

        { 

            switch(b)

            {

                case '+':return '>';break;

                case '-':return '>';break;

                case '*':return '>';break;

                case '/':return '>';break;

                case '(':return '<';break;

                case ')':return '>';break;

                case '#':return '>';break;

            }

            break;

        }

        case '(':

        { 

            switch(b)

            {

                case '+':return '<';break;

                case '-':return '<';break;

                case '*':return '<';break;

                case '/':return '<';break;

                case '(':return '<';break;

                case ')':return '=';break;

                case '#':return ERROR;break;

            }

            break;

        }

        case ')':

        { 

            switch(b)

            {

                case '+':return '>';break;

                case '-':return '>';break;

                case '*':return '<';break;

                case '/':return '<';break;

                case '(':return ERROR;break;

                case ')':return '>';break;

                case '#':return '>';break;

            }

            break;

        }

        case '#':

        { 

            switch(b)

            {

                case '+':return '<';break;

                case '-':return '<';break;

                case '*':return '<';break;

                case '/':return '<';break;

                case '(':return '<';break;

                case ')':return ERROR;break;

                case '#':return '=';break;

            }

        }

    }

}