题解 | #四则运算#
四则运算
http://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
- 题目有三种括号,其实看成一种即可,因为不同括号是给人看的,把它们都想成圆括号即可
- 每一个括号的操作都是一样的操作,也就是每遇到括号就会递归
- 每递归一次,就会蜕去外层括号
- 使用vector模拟栈,就可以省去入栈、出栈,返回栈的和即可
- 使用两个指针,这样避免拷贝,或者是C语言的二级指针
#include <bits/stdc++.h> using namespace std; int calulate(string& s, int start, int end) { vector<int> sta; char sign = '+'; int n = s.size(); int number = 0; for (int i = start; i <= end; ++i) { // if (s[i] == ' ') continue; /**<忽略空格 */ if (isdigit(s[i])) number = 10*number + (s[i]-'0'); /**<三组括号视为同一种情况,匹配对应的括号位置,同时剔除外层括号 */ if (s[i] == '(' || s[i] == '[' || s[i] == '{') { int level = 0; int j = i; for (; j <= end; ++j) { if (s[j] == '(' || s[j] == '[' || s[j] == '{') ++level; else if (s[j] == ')' || s[j] == ']' || s[j] == '}') { if (--level == 0) break; } } number = calulate(s, i+1, j-1); /**<同时剔除外层括号 */ i = j + 1; } if (!isdigit(s[i]) || i==end) { switch (sign) { case '+': sta.push_back(number); break; case '-': sta.push_back(-number); break; case '*': sta.back() *= number; break; case '/': sta.back() /= number; break; } sign = s[i]; number = 0; } } return accumulate(sta.begin(), sta.end(), 0); } int main(int argc, char *argv[]) { cin.tie(0), cout.tie(0), ios::sync_with_stdio(0); /**<题目不考虑空格 */ string s; while(cin >> s) { cout << calulate(s, 0, s.size()-1) << '\n'; } return 0; }