原题传送门
(萌萌哒)算法
思路非常简单。
我们知道,这题其实本来就是一个中缀表达式,而且还是只有两种运算符的那种(哇哦,又少了一点代码!)。
经典的栈。
中缀表达式怎么求?
- 转后缀!(过程略略略)
后缀怎么求?
1. 将数字“塞”进(数)栈
2. 看到符号了,也将其“塞”进(符号)栈
3. 将最上面的两个数字“掏”出(数)栈
4. 将符号“掏”出(符号)栈
5. 开switch(符号)
6. 运算
7. 将运算结果“塞”进栈
注意:掏出栈=int 变量=栈名.top();栈名.pop();
塞进栈=栈名.push(值);
完事!!!
(重中之重)C++ 代码
/*********************************************************************
版权: 归作者所有
作者: wanghancheng
日期: 2021-03-20 11:43
说明: 本代码仅供学习所用,ctrl+a&ctrl+c&ctrl+v虽然作者不知晓,但是希望这些人能真正懂得其中的知识!
*********************************************************************/
#include <bits/stdc++.h>
using namespace std;
stack <int>nums;
stack <char>ops;
string s;
int grade(char c) {
if (c == '(')
return 1;
if (c == '+' || c == '-')//减号、除号……别管那么多!!!
return 2;
if (c == '*' || c == '/')
return 3;
return 0;
}
void calc() {
long long b = nums.top();
nums.pop();
long long a = nums.top();
nums.pop();
char op = ops.top();
ops.pop();
switch (op) {
case '+':
nums.push((int)((a + b) % 10000));
break;
case '*':
nums.push((int)((a * b) % 10000));
break;
}
}
long long infix_to_suffix_and_operation(string s) {
while (!nums.empty())
nums.pop();
while (!ops.empty())
ops.pop();
int val = 0;
for (int i = 0; i < s.length(); ++i) {
if (s[i] == ' ')
continue;
else if (isdigit(s[i])) {
val = val * 10 + s[i] - '0';
if (i + 1 < s.length() && isdigit(s[i + 1]))
continue;
nums.push(val);
val = 0;
} else if (s[i] == '(')
ops.push(s[i]);
else if (s[i] == ')') {
while (ops.top() != '(')
calc();
ops.pop();
} else {
while (!ops.empty() && grade(ops.top()) >= grade(s[i]))
calc();
ops.push(s[i]);
}
}
while (!ops.empty())
calc();
return nums.top();
}
int main() {
getline(cin, s);
cout << infix_to_suffix_and_operation(s) % 10000;
return 0;
}
求资瓷~
资瓷