题目链接:

​http://acm.hdu.edu.cn/showproblem.php?pid=1274​


题目大意:

为了表示纺织CAD系统的纱线排列问题。用小写字母来表示不同的纱线,连接在一起表示纱线的组合。

前边加数字表示重复多少次。比如2(abc),a、b、c表示不同的纱线,abc表示纱线组合,2+()表示abc

重复两次,即abcabc。如果前边没有数字,则默认为1。现在给你一个这样的字符串,请将表达式展开

输出排列结果。


思路:

使用栈操作,将字符串展开。重点在于去括号。

1)如果遇到数字或是左括号,直接入栈。

2)如果遇到字母,分两种情况:

栈顶元素为数字num,则将字母压入占中num次。

栈顶为左括号或是其他字母,则直接入栈

3)如果遇到右括号,用temp[]存储括号内的字母,并将这些字母出栈。

这时,如果栈顶元素为数字num或是空(num=1),降temp的字母压入栈中num次。

4)将最后栈中的字母全部存入结果ans[]中。


AC代码:


#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<stack>
#include<string>
using namespace std;

string ans,s,temp;

int main()
{
int T;
cin >> T;
stack<char> Q;
while(T--)
{
ans.clear();
s.clear();
temp.clear();
cin >> s;
int len = s.length();
for(int i = 0; i < len; ++i)
{
if( s[i]=='(' || (s[i] >= '0' && s[i] <= '9') ) //遇到数字,直接入栈
{
Q.push(s[i]);
}
else if(s[i]>='a' && s[i] <= 'z') //遇到字母
{
if(Q.top()>='0' && Q.top()<='9') //栈顶元素是数字
{
int num = Q.top() - '0';
Q.pop();
while(num--)
Q.push(s[i]); //将字母压入栈num次
}
else
Q.push(s[i]); //没有数字,则直接将字母压入栈中
}
else if(s[i]==')') //遇到右括号
{
string temp;
while(Q.top()!='(')
{
temp.insert(temp.begin(),Q.top()); //存储括号内的字符串
Q.pop();
}
Q.pop();
int num; //记录需要压入字符串的次数
if( Q.empty() || !(Q.top()>='0'&&Q.top()<='9') )
{
num = 1;
}
else
{
num = Q.top() - '0';
Q.pop();
}
while(num--) //将括号内字符串压入num次
{
for(int j = 0; j < temp.size(); ++j)
Q.push(temp[j]);
}
}
}
while(!Q.empty()) //将栈中字符全部存入结果ans[]中
{
ans.insert(ans.begin(),Q.top());
Q.pop();
}
cout << ans << endl;
}

return 0;
}