题目链接:
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; }
时间: 2024-10-07 06:05:40