小明在你的帮助下,破密了 Ferrari 设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有(,),0-9,+,-,*,/,^,求出的值就是密码。小明数学学得不好,还需你帮他的忙。(/用整数除法)
输入样例:
1+(3+2)∗(72+6∗9)/(2)
输出样例:
258
#include<bits/stdc++.h>
using namespace std;
int cal(char op, int a, int b)
{
switch(op)
{
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
case '^': return pow(a, b);
return 0;
}
}
int yxj(char op)
{
if (op == '+' || op == '-') return 1;
if (op == '*' || op == '/') return 2;
if (op == '^') return 3;
return 0;
}
int solve(string s)
{
stack<int> val;
stack<char> ops;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == ' ') continue;
if (isdigit(s[i]))
{
int v = 0;
while (i < s.size() && isdigit(s[i]))
{
v = (v * 10) + (s[i] - '0');
i++;
}
val.push(v);
i--;
}
else if (s[i] == '(') ops.push(s[i]);
else if (s[i] == ')')
{
while (!ops.empty() && ops.top() != '(')
{
int v2 = val.top();
val.pop();
int v1 = val.top();
val.pop();
char op = ops.top();
ops.pop();
val.push(cal(op, v1, v2));
}
if (!ops.empty()) ops.pop();
}
else
{
while (!ops.empty() && yxj(ops.top()) >= yxj(s[i]))
{
int v2 = val.top();
val.pop();
int v1 = val.top();
val.pop();
char op = ops.top();
ops.pop();
val.push(cal(op, v1, v2));
}
ops.push(s[i]);
}
}
while (!ops.empty())
{
int v2 = val.top();
val.pop();
int v1 = val.top();
val.pop();
char op = ops.top();
ops.pop();
val.push(cal(op, v1, v2));
}
return val.top();
}
int main()
{
string s;
getline(cin, s);
cout << solve(s);
return 0;
}