展开字符串
Problem Description
在纺织CAD系统开发过程中,经常会遇到纱线排列的问题。
该问题的描述是这样的:常用纱线的品种一般不会超过25种,所以分别可以用小写字母表示不同的纱线,例如:abc表示三根纱线的排列;重复可以用数字和括号表示,例如:2(abc)表示abcabc;1(a)=1a表示a;2ab表示aab;如果括号前面没有表示重复的数字出现,则就可认为是1被省略了,如:cd(abc)=cd1(abc)=cdabc;这种表示方法非常简单紧凑,也易于理解;但是计算机却不能理解。为了使计算机接受,就必须将简单紧凑的表达方式展开。某ACM队接受了此项任务。现在你就是该ACM队的一员,请你把这个程序编写完成。
已知条件:输入的简单紧凑表达方式的长度不超过250个字符;括号前表示重复的数不超过1000;不会出现除了数字、括号、小写字母以外的任何其他字符;不会出现括号不配对等错误的情况(错误处理已由ACM其他队员完成了)。
该问题的描述是这样的:常用纱线的品种一般不会超过25种,所以分别可以用小写字母表示不同的纱线,例如:abc表示三根纱线的排列;重复可以用数字和括号表示,例如:2(abc)表示abcabc;1(a)=1a表示a;2ab表示aab;如果括号前面没有表示重复的数字出现,则就可认为是1被省略了,如:cd(abc)=cd1(abc)=cdabc;这种表示方法非常简单紧凑,也易于理解;但是计算机却不能理解。为了使计算机接受,就必须将简单紧凑的表达方式展开。某ACM队接受了此项任务。现在你就是该ACM队的一员,请你把这个程序编写完成。
已知条件:输入的简单紧凑表达方式的长度不超过250个字符;括号前表示重复的数不超过1000;不会出现除了数字、括号、小写字母以外的任何其他字符;不会出现括号不配对等错误的情况(错误处理已由ACM其他队员完成了)。
Input
本题有多个测试数据组,第一行输入的就是数据组数N,接着就是N行表达式,表达式是按照前面介绍的意义书写的。
Output
输出时含有N行,每行对应一个输入的表达式。
Sample Input
2 1(1a2b1(ab)1c) 3(ab2(4ab))
Sample Output
abbabc abaaaabaaaababaaaabaaaababaaaabaaaab
解题思路
利用栈,
如果是数字或者左括号,直接入栈
如果是字母,栈顶元素如果是数字,那么就压入数字的次数,否则一次
如果是右括号,从栈顶到第一个左括号为止的所有字母存入一个temp字符串中,然后按照左括号前的数字讲temp压入数字次
代码
#include <iostream>
#include <cstdio>
#include <map>
#include <cmath>
#include <string.h>
#include <algorithm>
#include <set>
#include <sstream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 10010;
const int INF = 0x3f3f3f3f;
int main()
{
int n;
scanf("%d",&n);
while(n--){
stack<char> q;
string s,ans;
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'){
int num = 1;
if(!q.empty() && q.top()>='0' && q.top()<='9') {
num = q.top()-'0';
q.pop();
}
while(num--) 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 = 1;
if(q.top()>='0' && q.top()<='9'){
num = q.top()-'0';
q.pop();
}
while(num--){
for(int j = 0; j<temp.length(); ++j){
q.push(temp[j]);
}
}
}
}
while(!q.empty()){
ans.insert(ans.begin(),q.top());
q.pop();
}
cout << ans <<endl;
}
return 0;
}