计蒜客 题解

校内考试 计蒜客 题解

题目大意

计算一个含 + - * / ( ) 的表达式

思路分析

考虑维护两个栈,一个储存数字,一个储存符号,思考会出现几种情况:

1、数字:

  • 直接入栈

2、符号

  • 2.1、乘、除、开始括号:

    • 因为在四则运算中,这三个符号的优先级最高,所以直接入站
  • 2.2、加、减:

    • 优先级较低,应该先把栈顶的乘除法进行计算,再将加减入栈。
  • 2.3、结束括号:

    • 读到结束括号后,就珂以把栈顶的元素一个个拿出来运算,直到拿出开始括号
    • 因为在读到加减时会进行乘除运算,所以最后除了紧挨着括号的乘除运算,就只有加减需要运算

3、结束:

  • 读完文件后,其实和读到结束括号时是一样的,因为可以把整个表达式看成被一个括号所包围

注意,因为要求从左向右运算,所以要反着读数据

关键代码

//主题循环
string e;//表达式
for(int i=n-1;i>=0;i--){
    //读数字
    if(e[i]>='0'&&e[i]<='9'){
        int nu=e[i]-'0';i--;//移动一位
        int len=0;
        while(e[i]>='0'&&e[i]<=9){
            len++;
            int ans=1;for(int i=1;i<=len;i++){
                ans*=10;
            }//计算位数
            nu=nu+(e[i]-'0')*ans;
        }
        num.push(nu);//num->数字栈
    }
    //...//
    //读到+/-时
    if(e[i]=='+'||e[i]=='-'){
        //把栈顶的所有乘除都进行计算
        while(true){
            if(op.empty())break;//防Bug
            if(op.top()=='*'||op.top()=='/'){
                char opt=op.top();op.pop();
                int num1=num.top();num.pop();
                int num2=num.top();num.pop();
                int nu=opt=='*'?num1*num2:num1/num2;
                //三目运算
                num.push(nu);
            }
            else break;
        }
    }
    op.push(e[i]);
    //...//
    //读到左括号时
    if(e[i]=='('){
        //进行乘除运算
        while(true){
            if(op.empty())break;//防Bug
            if(op.top()=='*'||op.top()=='/'){
                char opt=op.top();op.pop();
                int num1=num.top();num.pop();
                int num2=num.top();num.pop();
                int nu=opt=='*'?num1*num2:num1/num2;
                //三目运算
                num.push(nu);
            }
            else break;
        }
        //进行加减运算
        while(op.top()!=')'){
            char opt=op.top();op.pop();
            int num1=num.top();num.pop();
            int num2=num.top();num.pop();
            int nu=opt=='+'?num1+num2:num1-num2;
            num.push(nu);
        }
        op.pop();//删除右括号
    }
    //...//
}
//...//

请注意,这份代码是不完整的。完整代码:云剪贴板

posted @   Locked_Fog  阅读(146)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示
主题色彩