题解 | #计算表达式#

计算表达式

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

//stack <char>  oper 操作符
//stack <double> num 中间数字
//从左向右遍历表达式 1.数字、num压栈 2.运算符 a.高优先级 oper压栈 b.低优先级/相等 先oper弹出一个、再num弹出两个进行运算压回num,
//再把新的运算符压栈

#include <iostream>
#include<cstdio>
#include<map>
#include<stack>
#include<string>
using namespace std;
map<char, int> priority = {
    {'$', 0},
    {'+', 1}, {'-', 1},
    {'*', 2}, {'/', 2}
};
int main() {
    string str;
    while (getline(cin, str)) {

        if (str == "0") {
            break;
        }
        str.push_back('$');//补充一个终止符
        stack<char>oper;
        stack<double>numb;
        string num;
        for (int i = 0; i < str.size(); ++i) {
            if (str[i] >= '0' &&
                    str[i] <= '9') { //用来搜索单独的0-9以组成一个数
                num.push_back(str[i]);
           if (str[i] != str.size() - 1 && !(str[i + 1] >= '0' && str[i + 1] <= '9'))  {
                numb.push(stod(num));
                    num = " ";
                }
                }
                //前面都在处理数
                else {
                while (!oper.empty() &&
                        priority[oper.top()] >=
                        priority[str[i]]) //说明比str[i]优先级更高的运算符都计算过了
                    //新来的运算符的优先级不高于栈顶的优先级
                {
                    char op = oper.top(); //弹出原来的运算符
                    oper.pop();
                    double rhs = numb.top();
                    numb.pop();
                    double lhs = numb.top();
                    numb.pop();//弹出左右两个操作数
                    switch (op) {


                        case'+':
                            numb.push(lhs + rhs);
                            break;
                        case'-':
                            numb.push(lhs - rhs);
                            break;
                        case'*':
                            numb.push(lhs * rhs);
                            break;
                        case'/':
                            numb.push(lhs / rhs);
                            break;
                    }

                }
                oper.push(str[i]);
            }
        }
       cout<<numb.top()<<endl;
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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