题解 | #表达式求值# 双栈

表达式求值

https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

#include <iostream>
#include <string>
#include <stack>
#include <map>
using namespace std;

map<char, int> prioit = {
    {'+', 0},
    {'-', 0},
    {'*', 1},
    {'/', 1},
    {'(', -1},
    {')', 2}
};
bool compare(char& a, char& b) {
    if (prioit[a] < prioit[b]) return false;
    return true;
}

void myOperator(stack<int>& num, stack<char>& op) {
    int b = num.top();
    num.pop();
    int a = num.top();
    num.pop();
    char c = op.top();
    op.pop();

    int res;
    switch (c) {
        case '+':
            res =  a + b;
            break;
        case '-':
            res = a - b;
            break;
        case '*':
            res = a * b;
            break;
        case '/':
            res = a / b;
            break;
    }
    num.push(res);
}

int main() {
    string s;
    cin >> s;
    s = s + ")";
    stack<int> num;
    stack<char> op;
    op.push('(');
    string n = "";
    char pre = '(';
    for (char& i : s) {
        if (prioit.count(i) == 0) {
            n += i;
        } else {
            if (i == '-') {
                if (prioit.count(pre) != 0 && pre != ')') {
                    num.push(0);
                }
            }

            if (n.size() != 0) {
                int num_ = stoi(n);
                num.push(num_);
                n = "";
            }
            if (i == '(') {
                op.push(i);
            } else if (i == ')') {
                while (op.top() != '(') {
                    myOperator(num, op);
                }
                op.pop();
            } else {
                while (compare(op.top(), i)) {
                    myOperator(num, op);
                }
                op.push(i);
            }
        }
        pre = i;
    }

    cout << num.top();
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

11-18 15:57
门头沟学院 Java
最终归宿是测开:这个重邮的大佬在重邮很有名的,他就喜欢打92的脸,越有人质疑他,他越觉得爽😂
点赞 评论 收藏
分享
12-01 12:34
已编辑
广东工业大学 Java
如题,fw🐭🐭,加上准备的太晚,大三上已找不到日常实习,导致连锁反应,下学期的暑期实习找不到好的实习,导致秋招找不到中大厂,现在是中小厂Java还有考公的选择,由于有些中小厂工作强度比肩大厂,钱还少,感觉不如考公如果🐮u们是我现在这种情况,会怎么选?
负债的混子:关注你一段时间了,突然发现你头像名字都改了,想必是这段时间压力很大。关于就业还是考公的选择,就像很多牛友说的:不要美化自己没走过的路。你现在想往互联网发展,发现这条路很难走,然后想往考公发展,但是你没走过考公这条路,所以你不知道这条路的压力如何。你今年大三了,还有时间给你做选择,我希望你能够尽快的决定自己的方向,然后一条路走到黑,而不是在这里徘徊,每个人的道路是不一样的,你无法复刻别人的路,你能做的就是尽力的完善自己。 最后,我想说的是,加油,陌生人!
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务