写代码过程中应该把代码意义写出来,理清思路,发现边界条件。
void calelem(deque<string>& que,int pre)//这个部分一直出错,因为没有考虑清楚pre是第一个字符和之前字符是加减号时该怎么处理,这时应该直接放入队列
{
if (!que.empty())
{
string temp = que.back();
if (temp == "*" || temp == "/")//如果之前的字符是乘除号,则计算乘除结果
{
que.pop_back();
pre = temp == "*" ? pre * (atoi(que.back().c_str())) : (atoi(que.back().c_str()) / pre);
que.pop_back();
}
}
que.push_back(to_string(pre));//如果pre是第一个数字或之前的字符是加减号则将数字直接放入队列,如果是乘除号则将计算结果放入队列
}
int getsum(deque<string>& que)
{
int res = 0;
while (!que.empty())
{
string cur = que.front();
que.pop_front();
if (cur == "+" || cur == "-")//如果当前字符是加减,则计算结果
{
int temp = atoi(que.front().c_str());
que.pop_front();
res += cur == "+" ? temp : (-temp);
}
else
res = atoi(cur.c_str());
}
return res;
}
std::unique_ptr<int[]> getres(string s, int i)
{
deque<string> que;
int pre = 0;
while (i < s.size() && s[i] != ')')//如果遇到)则结束或者到达字符串的最后一个字符则结束
{
if (s[i]>='0'&&s[i] <= '9')
pre = 10 * pre + s[i++]-'0';
else if (s[i] != '(')//如果当前字符是运算符
{
calelem(que, pre);//根据之前的字符判断怎么操作pre
que.push_back(string(1,s[i++]));//将当前字符放入队列中
pre = 0;//将pre置0,以便能计算下一个数字
}
else//如果遇到左括号,则计算括号内的结果,利用了递归的方式,因为子步骤都一样
{
std::unique_ptr<int[]> arr = move(getres(s, i+1));
pre = arr[0];//返回括号内的结果
i = arr[1];
}
}
que.push_back(to_string(pre));//循环结束,将pre放入队列
std::unique_ptr<int[]> a(new int[2]);//不能使用局部数组,返回后该数组将被释放掉
res[0] = getsum(que);
res[1] = i + 1 ;//进行剩余的加减运算,并返回结果,和当前的位置。
return a;
}