蓝桥杯算法训练 表达式计算(优化版)

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

算法如下,解释全在代码中:

//#include
#include
#include
using namespace std;
string ans;     //存表达式中的数字
stack<char> c;   //存操作符
stack<int> num; //存操作数
int x,y,res;   //x,y存要计算的值,res存计算的结果 
//数字字符串转整数 StringToInt
int stoi(string str){   
    int ans=0;
    for(int i=0;i10+(str[i]-'0');
    }

    return ans;
}
//计算两个数的加减乘除 
int caculate(int x,int y,char op) {
    if(op=='+')  return x+y;
    if(op=='-')  return x-y;
    if(op=='*')  return x*y;
    if(op=='/')  return x/y;
}
//如果运算符优先级等于或小于+、-操作符,调用该函数 
void caculate1() {
    while(c.top()!='(')
    {  //想象一下存操作数的情形 
        y=num.top();num.pop(); //连续取两个操作数 
        x=num.top();num.pop(); //先取的作为减数或者加数 
        res=caculate(x,y,c.top());
        num.push(res);
        c.pop();    //弹出用过的操作符
    }
}
//如果运算符小于或等于*、/运算符,调用此函数 
void caculate2() {
    while(c.top()=='*'||c.top()=='/')
    {
        y=num.top();num.pop(); //连续取两个操作数,注意有顺序 
        x=num.top();num.pop(); //先取的作为除数或者乘数 
        res=caculate(x,y,c.top());
        num.push(res);
        c.pop();   //弹出用过的操作符 

    }
}
//主函数 
int main () {
    //freopen("in.txt","r",stdin);
    string str;
    cin>>str;
    //用括号将表达式括起来,这样就不用单独处理以数字结尾的问题 
    str.insert(str.begin(),'(');
    str.append(")");
    //开始计算表达式,循环结束表达式计算完成 
    for(int i=0;i//取出数字部分 
        if(str[i]>='0'&&str[i]<='9')
        {
            ans+=str[i];
            continue;
        }
        if(!ans.empty())  //字符串不为空 
        {
            num.push(stoi(ans)); //将字符串转换为数字后,清空字符串 
            ans="";
        }
        //计算操作符 
        switch(str[i])
        {
            case '+':caculate1();c.push('+');break;
            case '-':caculate1();c.push('-');break;
            case '*':caculate2();c.push('*');break;
            case '/':caculate2();c.push('/');break;
            case '(':c.push('(');break;
            case ')':caculate1();c.pop();break;
        }
    }
    //计算的结果存在num栈中 
    cout<return 0;
}

你可能感兴趣的:(刷题)