HDU-1274 展开字符串

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其他队员完成了)。
 

 

Input
本题有多个测试数据组,第一行输入的就是数据组数N,接着就是N行表达式,表达式是按照前面介绍的意义书写的。
 

 

Output
输出时含有N行,每行对应一个输入的表达式。
 

 

Sample Input
2 1(1a2b1(ab)1c)
3(ab2(4ab))
 

 

Sample Output
abbabc
abaaaabaaaababaaaabaaaababaaaabaaaab
 
 
 
AC代码,仅供参考
 
 1 #include<iostream>
 2 #include<string>
 3 #include<stack>
 4 using namespace std;
 5 string process(string s)
 6 {
 7     string ans;
 8     stack<char> x;
 9     for(int i=0;i<s.size();++i)
10     {
11         if(s[i]>='0'&&s[i]<='9'||s[i]=='(')//是数字或左括号,直接入栈。
12             x.push(s[i]);
13         else if(s[i]>='a'&&s[i]<='z')//是字母。
14         {
15             if(x.top()<='9'&&x.top()>='0') //此时栈顶是数字。
16             {
17                 int num=x.top()-'0';
18                 x.pop();
19                 while(num--)
20                     x.push(s[i]);
21             }
22             else               //此时栈顶是左括号或其他字母。
23                 x.push(s[i]);
24         }
25         else if(s[i]==')')//是右括号。
26         {
27             string temp;
28             while(x.top()!='(')
29             {
30                 temp.insert(temp.begin(),x.top());
31                 x.pop();
32             }
33             x.pop();   //弹出左括号。
34             int num;
35             if(x.empty()||!(x.top()>='0'&&x.top()<='9'))//弹出左括号后栈为空,或者栈顶不是数字。
36                 num=1;
37             else
38             {
39                 num=x.top()-'0';//取出栈顶数字。
40                 x.pop();
41             }
42             while(num--)
43             {
44                 for(int j=0;j<temp.size();++j)
45                     x.push(temp[j]);
46             }
47         }
48     }
49     while(!x.empty())
50     {
51         ans.insert(ans.begin(),x.top());
52         x.pop();
53     }
54     return ans;
55 }
56 int main()
57 {
58     int test;
59     string s;
60     cin>>test;
61     while(test--)
62     {
63         cin>>s;
64         cout<<process(s)<<endl;
65     }
66     return 0;
67 }
View Code

 

posted @ 2016-08-08 16:09  劉小佳  阅读(264)  评论(0编辑  收藏  举报