地址:
点击打开链接
主要是思路,还有看清楚如何进行计算,值与+运算次数的模拟。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<stack>
using namespace std;
struct node{
int times ;
int val ;
}a,b;
stack<char> oper;
stack<node> nodes;
int main(){
int T ;
string target ;
scanf("%d",&T);
while(T--)
{
cin >> target;
for(int i = 0 ; i <target.length() ; i ++)
{
if(target[i]>='0'&&target[i]<='9')
{
int num =target[i]-'0';
i++;
while(target[i]>='0'&&target[i]<='9')
{
num =num*10+(target[i]-'0');
i++;
}
i--;
a.val = num ;
a.times = 0 ;
nodes.push(a);
}else if(target[i]==',')
{
while(!oper.empty()&&oper.top()=='+')
{
a = nodes.top();
nodes.pop();
b = nodes.top();
nodes.pop();
a.times+=b.times+1;
a.val+=b.val;
nodes.push(a);
oper.pop();
}
}
else if(target[i]=='+'||target[i]=='('){
oper.push(target[i]);
}else if(target[i]==')')
{
while(!oper.empty()&&oper.top()=='+')
{ a = nodes.top();
nodes.pop();
b = nodes.top();
nodes.pop();
a.times +=b.times+1;
a.val +=b.val;
nodes.push(a);
oper.pop();
}
oper.pop();
b= nodes.top();
nodes.pop();
a = nodes.top();
nodes.pop();
if(a.val>b.val)
{
a.times=a.times*2+b.times;
}
else {
a.val=b.val;
a.times=a.times+b.times*2;
}
nodes.push(a);
}
}
while(!oper.empty())
{
a = nodes.top();
nodes.pop();
b = nodes.top();
nodes.pop();
a.val +=b.val;
a.times+=b.times+1;
nodes.push(a);
oper.pop();
}
printf("%d %d\n",nodes.top().val,nodes.top().times);
nodes.pop();
}
}