乍一看好像并不难,通过率高达57%!但是写起来却找不到具体思路,仔细想了想应该用递归做,因为括号内的先执行,且执行的操作与括号外的一样。
但是,也就止步于此了,递归调用还不够熟练。。。
于是参考了一下别人的代码,自己在理解的基础上,手撕了一下:
#include<iostream>
#include<string>
#include<stack>
using namespace std;
string s;
int i;
int getResult(string& s)
{
int len = s.length();
char op = '+';//操作符 另用一个字符来存储
int num = 0;
int result=0;
stack<int>s1;// stack里面只存数字,且带正负号的数字
while (i < len)
{
if (s[i] == '{' || s[i] == '[' || s[i] == '(')//如果是左括号,则开始进行递归,原因是括号内的优先级最高,括号嵌套就一直内层继续递归
{
i++;
num=getResult(s);// 递归后应返回一个确定的值给上一层
}
while (i < len && isdigit(s[i]))//将数字输出:一位数、两位数、三位数,isdigit判断是否是数字
{
num = num * 10 + s[i] - '0';
i++;
}
switch (op) //判断操作符
{
case '+':
{
s1.push(+num);
};
break;
case '-':
{
s1.push(-num); }break;
case '*':
{
int temp = s1.top(); //乘号 以及下面的 除号 首先进行运算,因为优先级高于加减
s1.pop();
num = temp * num;
s1.push(num); }break;
case '/':
{
int temp = s1.top();
s1.pop();
num=temp/ num;
s1.push(num); }break;
}
num = 0;
op = s[i];//如果 既没有遇到括号 也没有遇到数字 那就是遇到操作符了,重新给op赋值
if (s[i] == ']' || s[i] == '}' || s[i] == ')')
{
i++; break;//此处的break并不是跳出循环,而是一层一层跳出递归;
}
i++;//这里的i++,用来 最后一层括号跳出后,或者最后一个数字输入结束后 判断
}
while(!s1.empty())
{
result += s1.top();
s1.pop();
}
return result;
}
int main()
{
while (getline(cin, s))
{
i = 0;
cout<<getResult(s)<<endl;
}
return 0;
}
30号华为机试,感觉还是要凉,ε=(´ο`*)))唉