题目描述
小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,
门上有一个算式,其中只有 ( )
,0 ~ 9
,+ - * / ^
,求出的值就是密码。
小明数学学得不好,还需你帮他的忙。(/
用整数除法)
输入格式
共 1 行,为一个算式。
输出格式
共 1 行,就是密码。
输入样例
1+(3+2)(7^2+69)/(2)
输出样例
258
题解
stack:
解题步骤
:
- 如果是数字:直接压入
数字栈
中; - 如果是
(
:直接压入字符栈
中; - 如果是
)
:就将括号内的表达式计算完; - 如果是运算符:若当前运算符的优先级 ≤ 前一个运算符的优先级,那么就计算前面的,再将当前运算符加入
字符栈
中;
特殊情况
:
减号
:如1 - 2 + 3
,此时无需特殊处理;负号
:如-1 - 2 + 3
和(1 + 2) * (-3 + 4)
,此时应该把-1
和-3
加入数字栈
中;
#include <iostream>
#include <stack>
#include <cmath>
#include <map>
using namespace std;
stack<int> num;
stack<char> op;
map<char, int> Hash;
void cal()
{
int b = num.top(); num.pop();
int a = num.top(); num.pop();
char c = op.top(); op.pop();
if(c == '+') num.push(a + b);
if(c == '-') num.push(a - b);
if(c == '*') num.push(a * b);
if(c == '/') num.push(a / b);
if(c == '^') num.push(pow(a, b));
}
int main()
{
string s;
cin >> s;
Hash['+'] = Hash['-'] = 1;
Hash['*'] = Hash['/'] = 2;
Hash['^'] = 3;
for (int i = 0; i < s.size(); i ++)
{
if(s[i] >= '0' && s[i] <= '9')
{
int j = i, n = 0;
while(j < s.size() && isdigit(s[j])) n = n * 10 + (s[j ++] - '0');
num.push(n);
i = j - 1;
}
else if(s[i] == '(')
{
op.push(s[i]);
}
else if(s[i] == ')')
{
while(op.top() != '(') cal();
op.pop();
}
else
{
while(op.size() && op.top() != '(' && Hash[op.top()] >= Hash[s[i]]) cal();
if(s[i] == '-' && (!i || s[i - 1] == '('))
{
int j = i + 1, n = 0;
while(j < s.size() && isdigit(s[j])) n = n * 10 + (s[j ++] - '0');
num.push(-n);
i = j - 1;
}
else op.push(s[i]);
}
}
while(op.size()) cal();
cout << num.top() << endl;
return 0;
}
ps:
- 很多题解都没考虑到负数的情况也过了😤
- 为啥用
getline
提交就会运行错误,害得我找了好久的错🤢