同样还是华为oj上的题,利用栈的思想实现
最后算出的数据都只有加减法,没有乘除法。
#include<string>
#include<iostream>#include<algorithm>
#include<sstream>
#include<vector>
#include<deque>
using namespace std;
void addnum(deque<string>& rec, int pre)
{
if (!rec.empty())
{
int cur = 0;if (rec.back() == "*" || rec.back() == "/"){
string tmp = rec.back();rec.pop_back();stringstream s1(rec.back());s1 >> cur;rec.pop_back();pre = (tmp == "*" ? cur*pre : cur / pre);
}
}}
stringstream ss;
ss << pre;
rec.push_back(ss.str());
return;
int getNum(deque<string>& rec)
{
int sum = 0;
int pre = 0;
string f = "+";
while (!rec.empty())
{
stringstream ss(rec.front());ss >> pre;rec.pop_front();sum = (f == "+" ? (sum + pre) : (sum - pre));if (!rec.empty()){
f = rec.front();rec.pop_front();
}
}}
return sum;
int* cal(string& s, int i)
{
deque<string> rec;
int pre = 0;
while (s[i] != ')'&&s[i] != ']'&&s[i] != '}'&&i<s.size())
{
if (s[i] >= '0'&&s[i] <= '9'){
pre = pre * 10 + (s[i] - '0');i++;
}else if (s[i] != '(' && s[i] != '[' && s[i] != '{'){
addnum(rec, pre);string sas;sas += s[i];rec.push_back(sas);pre = 0;i++;
}else{
int* tmp = NULL;tmp = cal(s, i + 1);pre = tmp[0];i = tmp[1] + 1;
}
}
addnum(rec, pre);
int *r = new int[2];
r[0] = getNum(rec);
r[1] = i;
return r;
}
int main()
{
string s;
while (cin >> s)
{
int* sum = cal(s, 0);cout << sum[0] << endl;
}
return 0;
}