面试算法 四则运算模拟

四则运算模拟,需要考虑括号和空格
用堆栈+递归进行模拟


#include <iostream>
#include <stack>
#include <string>
#include <queue>

using namespace std;

int yunsuan(char x, int a, int b) {
    int res = 0;
    if (x == '+') {
        res = a+b;
    } else if (x == '-') {
        res = a-b;
    } else if (x == '*') {
        res = a*b;
    } else if (x == '/') {
        res = a/b;
    }
    return res;
}

int getRes(string s) {
    stack<int> num;
    stack<char> f;
    char flag = ' ';
    for (int i=0; i<s.size(); i++) {
        if (s[i] == ' ') {
            continue;
        } else if (s[i] == '(') {
            int tmp = i++;
            int sum = 1;
            while(sum != 0) {
                if (s[i] == '(') {
                    sum++;
                } else if (s[i] == ')') {
                    sum--;
                }
                i++;
            }
            string substr = s.substr(tmp+1, i-tmp-2);
            num.push(getRes(substr));
            if (flag != ' ') {
                int b = num.top();
                num.pop();
                int a = num.top();
                num.pop();
                num.push(yunsuan(flag, a, b));
                flag = ' ';
            }
            i--;
        }
        else if (s[i] == '+' || s[i] == '-') {
            f.push(s[i]);
        } else if (s[i] == '*' || s[i] == '/') {
            flag = s[i];
        } else {
            int tmp = 0;
            while (s[i]>='0' && s[i]<='9') {
                tmp = tmp*10;
                tmp += s[i]-'0';
                i++;
            }
            num.push(tmp);
            if (flag != ' ') {
                int b = num.top();
                num.pop();
                int a = num.top();
                num.pop();
                num.push(yunsuan(flag, a, b));
                flag = ' ';
            }
            i--;
        }
    }
    while (!f.empty()) {
        int b = num.top();
        num.pop();
        int a = num.top();
        num.pop();
        num.push(yunsuan(f.top(), a, b));
        f.pop();
    }
    return num.top();
}

int main() {

    cout << getRes("3+4*(5+20/10) -7") << endl;

    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值