第一个题目,很简单,但是我就是没想明白,后来被点了一下,就是stack每次存储的都是最后一次的(5 4)括号中的第一个数字,用于记录个数,还需要定义一个Now变量,每次遇到(就乘以后边的数,并将这个数据进栈,遇到)就除以之前进栈的数据。
代码如下:
#include<iostream>
#include<cstdio>
#include<stack>
#include<map>
using namespace std ;
stack<int> Rem ;
map<int , int >res ;
int main(){
string s ;
while(getline(cin,s))
{
int Now = 1 ;
res .clear();
bool flag =false ;
while(!Rem.empty())
{
Rem.pop();
}
for(int i = 0 ; i < s.size(); i ++)
{
if(s[i]>='0'&&s[i]<='9')
{
int Num = 0 ;
while(s[i]>='0'&&s[i]<='9')
{
Num= Num*10+s[i++]-'0';
}
i -- ;
if(flag)
{
Rem.push(Num);
Now = Num*Now;
flag = false ;
}
else {
res[Num] +=Now;
}
}else if(s[i]=='(')
{
flag = true ;
}else if(s[i]==')')
{
int tp = Rem.top();
Rem.pop();
Now = Now/tp ;
}
}
for(int i = 1000 ; i >=0 ; i --)
{
if(res[i]>0)
printf("(%d,%d)\n",res[i],i);
}
}
}