社区讨论

20分,求教

P1981[NOIP 2013 普及组] 表达式求值参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m5ze1jp9
此快照首次捕获于
2025/01/16 21:50
去年
此快照最后确认于
2025/11/04 11:29
4 个月前
查看原帖
样例都过了,但只过了#1和#4
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1e8;
string s;
int a[N], atop = 0, btop = 0;
char b[N];

void f(int *a, char b, int c) {
	if (b == '+')
		a[c - 1] += a[c];
	else
		a[c - 1] *= a[c];
	return ;
}

int jud(char a) {
	if (a == '+')
		return 0;
	else
		return 1;
}

int main() {
	cin >> s;
	int len = s.length(), i = 0;

	while (i < len) {
		char c = s[i];

		if (c >= '0' && c <= '9') {
			int num = 0;

			for (; c >= '0' && c <= '9' && i < len; ) {

				i++;
				num = num * 10 + (ll)(c - '0');
				c = s[i];
			}

			a[++atop] = num;
			continue;
		} else {
			while (btop && jud(c) <= jud(b[btop]))
				f(a, b[btop--], atop--);
			b[++btop] = c;
		}

		i++;
	}

	while (btop >= 0)
		f(a, b[btop--], atop--);

	if (a[atop + 1] < 10000)
		cout << a[atop + 1];
	else
		cout << a[atop + 1] % 10000;
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...