计算器-腾讯笔试

题目描述:实现一个计算器的功能,输入是字符串,只包含整数字符和‘+’,‘x’,‘@’三种字符运算符。'@'优先级最高,'x'次之,‘+’最低。计算表达式的值。

思路:所有表达式均有效,因此符号的个数一定比数字个数少一位。

  1. 用两个栈实现,一个栈存放数字,一个栈存放运算符。
  2. 遍历字符串,同时以运算符的优先级规律做入栈和出栈操作,若当前运算符的优先级大于运算符栈顶元素的优先级,则将该运算符入栈;反之,则弹出栈中元素进行计算,直到当前运算符优先级大于运算符栈顶元素的优先级,将当前运算符入栈。运算符出栈的过程也是计算中间结果的过程。
  3. 字符串遍历完毕后,若运算符栈不为空,则不断计算,最后数据栈栈顶元素为答案。
void test01(string s) {
    //string s; cin >> s;
    stack<char> op;
    stack<long long> data;
    unordered_map<char, int> prio;
    prio['+'] = 1;
    prio['x'] = 2;
    prio['@'] = 3;

    long long num = 0;
    int n = s.length();
    int i = 0;
    for (; i < n; ) {
        if (isdigit(s[i])) {
            while (i < n && isdigit(s[i])) {
                num = 10 * num + s[i] - '0';
                ++i;
            }
            data.push(num);
            num = 0;        }
        else {
            if (op.empty()) {
                op.push(s[i]);
            }
            else {
                while (!op.empty() && prio[s[i]] <= prio[op.top()]) {
                    char opt = op.top(); op.pop();
                    long long b = data.top(); data.pop();
                    if (opt == '+') {
                        data.top() += b;
                    }
                    else if (opt == 'x') {
                        data.top() *= b;
                    }
                    else {
                        data.top() = data.top() | (data.top() + b);
                    }
                }
                op.push(s[i]);
            }
            ++i;
        }
    }

    while (!op.empty()) {
        char opt = op.top(); op.pop();
        int b = data.top(); data.pop();
        if (opt == '+') {
            data.top() += b;
        }
        else if (opt == 'x') {
            data.top() *= b;
        }
        else {
            data.top() = data.top() | (data.top() + b);
        }
    }

    cout << data.top() << endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值