求助 80分
查看原帖
求助 80分
303132
Okimoto楼主2021/1/25 10:25
#include <stdio.h>
#include <stack>
#include <queue>
#include <string.h>
#include <map>
using namespace std;
const int p = 10007;
struct stt
{
	int zero;
	int one;
	stt(int a, int b)
	{
		zero = a;
		one = b;
	}
};
int n;
stack <int> stk_i;
stack <stt> stk_s;
queue <int> que_s;
map <char, int> pri_o;
char buf[100007];
int main()
{
	pri_o['*'] = 2;
	pri_o['+'] = 1;
	scanf("%d", &n);
	scanf("%s", buf);
	for(int i = 0; i < n; i++)
	{
		char c = buf[i];
		if(c == '(')
		{
			stk_i.push(c);
			que_s.push('x');
		}
		else if(c == ')')
		{
			while(!stk_i.empty() && stk_i.top() != '(')
			{
				que_s.push(stk_i.top());
				stk_i.pop();
			}
			if(!stk_i.empty()){ stk_i.pop(); }
		}
		else
		{
			while(!stk_i.empty() && pri_o[stk_i.top()] >= pri_o[c])
			{
				que_s.push(stk_i.top());
				stk_i.pop();
			}
			stk_i.push(c);
			que_s.push('x');
		}
	}
	while(!stk_i.empty())
	{
		que_s.push(stk_i.top());
		stk_i.pop();
	}
	stk_s.push(stt(1, 1));
	while(!que_s.empty())
	{
		char c = que_s.front();
		que_s.pop();
		if(c == 'x')
		{
			stk_s.push(stt(1, 1));
		}
		else if(c == '+')
		{
			stt a = stk_s.top();
			stk_s.pop();
			stt b = stk_s.top();
			stk_s.pop();
			stk_s.push(stt(a.zero * b.zero % p, (a.zero * b.one % p + a.one * b.zero % p + a.one * b.one % p) % p));
		}
		else
		{
			stt a = stk_s.top();
			stk_s.pop();
			stt b = stk_s.top();
			stk_s.pop();
			stk_s.push(stt((a.zero * b.zero % p + a.zero * b.one % p + a.one * b.zero % p) % p, a.one * b.one % p));
		}
	}
	printf("%d", stk_s.top().zero % p);
	return 0;
}

2021/1/25 10:25
加载中...