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

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

#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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值