题解 | #四则运算#
四则运算
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;
}
查看4道真题和解析

