AC+AC+RE+AC+AC
查看原帖
AC+AC+RE+AC+AC
765239
sakura_21楼主2024/7/19 11:59
#include<bits/stdc++.h>//p10473
#define int long long
using namespace std;
string s;
stack<char>k;
stack<int>a;
stack<string>f;
queue<string>q;
//string ans;
int qpow(int x,int y)
{
	int ns=1,res=x;
	while(y>0)
	{
		if (y&1)
		{
			ns*=res;
		}
		res*=res;
		y=y>>1;
	}
	return ns;
}
signed main()
{
	cin>>s;
	int len=s.size();
	
	if (!s.empty()&&s[0]==')')s.erase(0,1);
	if (!s.empty()&&s[len-1]=='(')s.erase(len-1,1);
	int l=0;
	for(int i=0;i<s.size()-2;i++)
	{
		if ((s[i]<'0'||s[i]>'9')&&(s[i]!='('&&s[i]!=')')&&s[i+1]=='-')s.insert(i+1,"("),i++;
		else if ((i==0&&s[i+1]>='0'&&s[i+1]<='9'))
		{
			s.insert(i,"(");i+=2;
			while(s[i]>='0'&&s[i]<='9')
			{
				i++;
			}
			s.insert(i,")");i+=2;
		}
	}
	for (int i=0;i<len;i++)
	{
		if(s[i]=='(')k.push('(');
		else if (s[i]==')'&&!k.empty())
		{
			k.pop();
		}
		else if (s[i]==')'&&k.empty())
		{
			l++;
		}
	}
	if (!k.empty())
	{
		while(!k.empty())
		{
			s+=')';k.pop();
		}
	}
	if (l!=0)
	{
		while(l!=0)
		{
			s.insert(0,"(");
			l--;
		}
	}
	int num=0,ff=0;
	len=s.size();
	for(int i=0;i<len;i++)
	{
		if(s[i]>='0'&&s[i]<='9')
		{
			num=num*10+s[i]-'0'; ff=1;
		}
		else
		{ 
			if (ff==1)	q.push(std::to_string(num));
			num=0;ff=0;
		}
		
		if (s[i]<'0'||s[i]>'9')
		{ff=0;
			string y;y=s[i];
			if (s[i]=='(')f.push("(");
			else if (s[i]==')')
			{
				while(!f.empty()&&f.top()!="(")
				{
					q.push(f.top());
					f.pop();
				}
				f.pop();
			}
			else if (f.empty())f.push(y);
			else if (f.top()=="(")f.push(y);
			else if ((f.top()=="+"||f.top()=="-")&&(s[i]=='*'||s[i]=='/'))f.push(y);
			else if (s[i]=='^')f.push(y);
	
			else if (s[i]=='+'||s[i]=='-')
			{
				while(!f.empty()&&f.top()!="(")
				{
					q.push(f.top());
					f.pop();
				}
			//	f.pop();
				f.push(y);
			}
			else if (s[i]=='*'||s[i]=='/')
			{
				//cout<<1<<s[i]<<endl;
				while(!f.empty()&&f.top()!="("&&f.top()!="+"&&f.top()!="-")
				{
					
					q.push(f.top());
					f.pop();
				}
				f.push(y);
			}
			
		}
	}
	if (ff==1)q.push(std::to_string(num));
	ff=0;
	while(!f.empty())
	{
		q.push(f.top());
		f.pop();
	}
	stack<int>um;
	int lq=q.size();
	for (int i=0;i<lq;i++)
	{
		if ((q.front()[0]>='0'&&q.front()[0]<='9')||(q.front()[1]>='0'&&q.front()[1]<='9'))
		{//cout<<11111; 
			int sz=stoll(q.front());
			um.push(sz);
			q.pop();
		}
		else if (um.size()>1&&q.front()=="+")
		{
			int xx=um.top();um.pop();
			int yy=um.top();um.pop();
			um.push(yy+xx);//cout<<xx<<"+"<<yy<<"="<<um.top()<<endl;
			q.pop();
		}
		else if (um.size()>=1&&q.front()=="-")
		{
			int xx=um.top();um.pop();
			um.push(-xx);q.pop();//cout<<xx<<endl;
			//int yy=um.top();um.pop();
		//	um.push(yy-xx);
	//	cout<<xx<<"="<<um.top()<<endl;
			//q.pop();
		}
		else if (um.size()>1&&q.front()=="*")
		{
			int xx=um.top();um.pop();
			int yy=um.top();um.pop();
			um.push(yy*xx);//cout<<xx<<"*"<<yy<<"="<<um.top()<<endl;
			q.pop();
		}
		else if (um.size()>1&&q.front()=="/")
		{
			int xx=um.top();um.pop();
			int yy=um.top();um.pop();
			um.push(yy/xx);//cout<<xx<<"/"<<yy<<"="<<um.top()<<endl;
			q.pop();
		}
		else if (um.size()>1&&q.front()=="^")
		{
			int xx=um.top();um.pop();
			int yy=um.top();um.pop();
			um.push(qpow(yy,xx));//cout<<xx<<"^"<<"="<<um.top()<<yy<<endl;(1+2)/3*4+1^19
			q.pop();
		}
	}
	int ans=0;
	while(!um.empty())
	{
		ans+=um.top(); 
		um.pop();
	}
	cout<<ans;
	return 0;
}
2024/7/19 11:59
加载中...