题解 | 计算表达式

计算表达式

https://www.nowcoder.com/practice/7b18aa6b7cc14f8eaae6b8acdebf890b

#include "stdio.h"
#include "map"
#include "stack"
#include "string"
using namespace std;

int main(){
    // 定义输入表达式的字符数组
    char inputExpression[1000]={0};
    
    // 第一步:定义运算符优先级映射
    map<char,int> priority={
            {'\0',0},  // 字符串结束符,最低优先级
            {'+',1},{'-',1},  // 加减法,低优先级
            {'*',2},{'/',2}   // 乘除法,高优先级
    };

    // 读取输入表达式,直到文件结束
    while(scanf("%s",inputExpression)!=EOF){
        // 定义处理过程中需要的变量
        string Numstr;          // 用于临时存储数字字符
        stack<double> NumStack; // 数字栈
        stack<char> OperatorStack; // 运算符栈
        
        // 第二步:逐字符处理表达式
        for(int i=0;;i++){
            // 如果是数字,追加到数字字符串
            if(inputExpression[i]>='0'&&inputExpression[i]<='9'){
                Numstr.push_back(inputExpression[i]);
            }
            // 如果是运算符或结束符
            else{
                // 第三步:将数字字符串转换为实际数值并压入数字栈
                if(!Numstr.empty()){  // 确保数字字符串不为空
                    double currentNum=stod(Numstr);
                    Numstr="";        // 清空数字字符串,准备下一个数字
                    NumStack.push(currentNum);
                }
                
                // 第四步:根据运算符优先级进行计算
                // 如果当前运算符优先级小于等于栈顶运算符,则先计算栈内的表达式
                while(!OperatorStack.empty() && priority[inputExpression[i]]<=priority[OperatorStack.top()]){
                    // 取出栈顶的两个操作数和一个运算符
                    double rightoperand=NumStack.top();
                    NumStack.pop();
                    double leftoperand=NumStack.top();
                    NumStack.pop();
                    char currentoperator=OperatorStack.top();
                    OperatorStack.pop();
                    
                    // 第五步:执行运算并将结果压回数字栈
                    double result=0;
                    switch (currentoperator) {
                        case '+':result=leftoperand+rightoperand;break;
                        case '-':result=leftoperand-rightoperand;break;
                        case '*':result=leftoperand*rightoperand;break;
                        case '/':result=leftoperand/rightoperand;break;
                    }
                    NumStack.push(result);
                }
                
                // 第六步:处理表达式结束或压入新运算符
                if(inputExpression[i]=='\0'){
                    // 表达式结束,输出最终结果(取整数部分)
                    printf("%d\n",(int)NumStack.top());
                    break;
                }
                else{
                    // 压入当前运算符到运算符栈
                    OperatorStack.push(inputExpression[i]);
                }
            }
        }
    }
    return 0;
}

全部评论

相关推荐

arbeilaite:我说话也跟你一样
点赞 评论 收藏
分享
真的很糟糕:一般说看能力给工资意思就是给不起的借口
点赞 评论 收藏
分享
07-11 22:27
中南大学 Java
程序员牛肉:学历的话没问题。但是没问题的也就只有学历了。 其实你的整体架构是正确的,博客接着干。但是项目有点过于简单了。从后端的角度上讲,你这也就是刚入门的水平,所以肯定约面试够呛。 如果你要应聘后端岗位,那你第一个项目竟然是仿写操作系统。这个你要面试官咋问你。你一定要记住一点,你简历上写的所有的东西,都是为了证明你有能力胜任当前的岗位,而不是为了证明你自己会什么。 如果你只是浅浅的做几个项目,描述也都是烂大街。技术点也都是各种混水类的配置类需求,那你就不要幻想自己能走多远。一定要保持思考,保持学习。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-11 17:39
小呆呆的大鼻涕:卧槽,用户彻底怒了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务