2 条题解
-
3
题解
这道题可以说是有点难度,我们先来分析一波。
这道题的输入很明显是中缀表达式,我们程序对逆波兰表达式算起来得心应手,可是对于中缀就没有什么办法了(至少直接算来),我们可以构造树将其转换为后缀的逆波兰,
我懒得写。所以我们观察中缀表达式,考虑一下三年级数学讲的带符号搬家,我们发现,除了最开始一个数字,其他数都带有一个操作符。这样我们可以输入第一个数,然后输入操作符和数字。最后用栈模拟。
#include <bits/stdc++.h> using namespace std; int x, ans; char c; stack<int> s; const int mod = 10000; int main() { scanf("%d", &x); s.push(x); // 压入最开始的数字 while (c = getchar()) // getchar { if (c == '\n') break; // 如果读了个换行符,表示没数了 scanf("%d", &x); // 否则输入数字 if (c == '+') { } if (c == '*') { } } printf("%d\n", ); return 0; }
很简单吧。
一点也不简单。其实我们也可以输入整个字符串,再分解。
这里我们注意乘法运算级更高,需要优先。但是我们计算 时, 会被先计算,导致得不到正确结果。我们可以把加法直接压进栈,不用操作,乘法即时操作,算完压回栈。只要最后加一遍所有数字就可以了,我们模拟一下。
,把 压进去。
,把 压进去。
,把 取出,把 压进去。
遍历栈:,正确。
#include <bits/stdc++.h> using namespace std; int x, ans; char c; stack<int> s; const int mod = 10000; int main() { scanf("%d", &x); s.push(x); // 单独输入 while (c = getchar()) { if (c == '\n') break; scanf("%d", &x); if (c == '+') { s.push(x); // 先压入 } if (c == '*') { ans = s.top() * x % mod; // 立即计算 s.pop(); s.push(ans); } } ans = 0; while (!s.empty()) { ans = (ans + s.top()) % mod; // 计算总和,别忘了取模。 s.pop(); } printf("%d\n", ans); return 0; }
#include <bits/stdc++.h> using namespace std; int x, ans; char c; stack<int> s; const int mod = 10000; int main() { scanf("%d", &x); s.push(x); while (c = getchar()) { if (c == '\n') break; scanf("%d", &x); if (c == '+') { s.push(x); } if (c == '*') { ans = s.top() * x % mod; s.pop(); s.push(ans); } } ans = 0; while (!s.empty()) { ans = (ans + s.top()) % mod; s.pop(); } printf("%d\n", ans); return 0; }
- 1
信息
- ID
- 1426
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 145
- 已通过
- 62
- 上传者