蓝桥杯 算法训练 表达式计算

问题描述
  输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
  输入一行,包含一个表达式。
输出格式
  输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
  表达式长度不超过100,表达式运算合法且运算过程都在int内进行。


#include 
#include 
#include 
using namespace std;
stack  result;
stack  operation;
int getPriority(char op)//获取操作符的优先级
{
    if(op=='(')
        return 1;
    if(op=='+'||op=='-')
        return 2;
    if(op=='*'||op=='/')
        return 3;
}
int operate(int a,int b,char op)
{
    switch(op)
    {
    case '+':
        return a+b;
    case '-':
        return a-b;
    case '*':
        return a*b;
    case '/':
        return a/b;
    }
}
void calculate()//对栈中的两个数进行运算
{
    int a=result.top();
    result.pop();
    int b=result.top();
    result.pop();
    int c=operate(b,a,operation.top());
    result.push(c);
    operation.pop();
}
int main()
{
    char s[100],num[100];
    int p=0;
    cin>>s;
    while(true)
    {
        int i=0,n;
        while(s[p]>='0'&&s[p]<='9')
        {
            num[i]=s[p];
            ++i;
            ++p;
        }
        if(s[p]=='\0')//算式全部读入
            break;
        if(i>0)//读入一个操作数
        {
            num[i]='\0';
            n=atoi(num);
            result.push(n);
        }
        else//读入一个操作符
        {
            num[0]=s[p];
            ++p;
            if(num[0]==')')
            {
                while(operation.top()!='(')
                    calculate();
                operation.pop();
            }
            else if(operation.empty()||num[0]=='('||getPriority(num[0])>getPriority(operation.top()))
//读取到的操作符的优先级大于操作符栈栈顶的操作符,则该操作符入栈
                operation.push(num[0]);

            else
            {
                while(!operation.empty()&&getPriority(num[0])<=getPriority(operation.top()))
//读取到的操作符的优先级小于等于操作符栈栈顶的操作符,则对结果栈进行计算,
//直到操作符栈为空或栈顶的操作符优先级大于读取到的操作符
//例如,栈中的操作符为‘+’,读取的操作符为‘*’,则直接把‘*’放入栈中,
//若栈中的操作符为‘*’,读取的操作符为‘+’,则需要把之前加的操作完成,再将‘*’入栈
                    calculate();
                operation.push(num[0]);
            }
        }
    }
    while(!operation.empty())//算式读取完毕但还有没完成的操作
        calculate();
    cout<


你可能感兴趣的:(数据结构)