CSU-ACM2017暑期训练3-递推与递归 G

来源:互联网 发布:北京酒店推荐 知乎 编辑:程序博客网 时间:2024/06/05 20:51

题目:

在纺织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
21(1a2b1(ab)1c)3(ab2(4ab))
Sample Output
abbabcabaaaabaaaababaaaabaaaababaaaabaaaab

           题目大意:就是给你一串字符的简写形式,要你写出原串

           思路:明明是递归专题,然而并不会递归,想到了用栈,最后还是参考了别人的思路才写出的。思路直接见代码注释吧。

代码:

#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> st;//存最后的原串的栈    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'))//如果遇到了左括号或者是数字直接入栈            {                st.push(s[i]);            }            else if(s[i]>='a'&&s[i] <= 'z')//如果遇到了字母,看他前面是数字还是左括号            {                if(st.top()>='0'&&st.top()<='9')//如果是数字说明在这个位置要将这个字母输出num次                {                    int num=st.top()-'0';//将数字弹出                    st.pop();                    while(num--)                        st.push(s[i]);//将num个该字母入栈                }                else//如果字母前面是左括号,将该字母入栈,等待右括号                    st.push(s[i]);            }            else if(s[i]==')')//如果遇到了右括号,将括号间的字母全部弹出并拷贝一份,再看相应的左括号前面是否有数字,如果有,将该字符串弹进栈num次,否则就一次就行            {                string temp;                while(st.top()!='(')                {                    temp.insert(temp.begin(),st.top());//后出的字母其实是在字符串的前面                    st.pop();                }                st.pop();                int num;                if(st.empty()||!(st.top()>='0'&&st.top()<='9'))                {                    num=1;                }                else                {                    num = st.top() - '0';                    st.pop();                }                while(num--)                {                    for(int j=0;j<temp.size();j++)                        st.push(temp[j]);                }            }        }        while(!st.empty())//最后将栈里的字符串拷出来,注意顺序还是后出来的字符在前面        {            ans.insert(ans.begin(),st.top());            st.pop();        }        cout<<ans<<endl;    }    return 0;}