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其他队员完成了)。
该问题的描述是这样的:常用纱线的品种一般不会超过25种,所以分别可以用小写字母表示不同的纱线,例如:abc表示三根纱线的排列;重复可以用数字和括号表示,例如:2(abc)表示abcabc;1(a)=1a表示a;2ab表示aab;如果括号前面没有表示重复的数字出现,则就可认为是1被省略了,如:cd(abc)=cd1(abc)=cdabc;这种表示方法非常简单紧凑,也易于理解;但是计算机却不能理解。为了使计算机接受,就必须将简单紧凑的表达方式展开。某ACM队接受了此项任务。现在你就是该ACM队的一员,请你把这个程序编写完成。
已知条件:输入的简单紧凑表达方式的长度不超过250个字符;括号前表示重复的数不超过1000;不会出现除了数字、括号、小写字母以外的任何其他字符;不会出现括号不配对等错误的情况(错误处理已由ACM其他队员完成了)。
21(1a2b1(ab)1c)3(ab2(4ab))
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;}
阅读全文
0 0
- CSU-ACM2017暑期训练3-递推与递归 G
- CSU-ACM2017暑期训练3-递推与递归 G
- CSU-ACM2017暑期训练3-递推与递归I
- CSU-ACM2017暑期训练3-递推与递归 J
- CSU-ACM2017暑期训练3-递推与递归 J
- CSU-ACM2017暑期训练3-递推与递归 H
- CSU-ACM2017暑期训练3-递推与递归I
- Function Run Fun--CSU-ACM2017暑期训练3-递推与递归
- CSU-ACM2017暑期训练3-递推与递归 D-Function Run Fun POJ-1579
- CSU-ACM2017暑期训练3-递推与递归 Non-boring sequences
- CSU-ACM2017暑期训练3-递推与递归 Erratic Expansion
- CSU-ACM2017暑期训练4-dfs G
- CSU-ACM2017暑期训练6-bfs G
- CSU-ACM2017暑期训练12-KMP G
- CSU-ACM2017暑期训练3 J
- CSU-ACM2017暑期训练16-树状数组 G
- Languages CSU-ACM2017暑期训练1-Debug与STL
- CSU-ACM2017暑期训练1-Debug与STL hdu2736
- CSS基础
- 2017多校第二场最后一题
- Java异常处理try-catch-finally的执行过程
- Scala的学习笔记_第二天
- excel2010打开多个页面的方法
- CSU-ACM2017暑期训练3-递推与递归 G
- BZOJ 1113: [Poi2008]海报PLA 单调栈
- 剑指offer-链表中环的入口结点
- 块状元素和行内元素的区别是什么?
- (99)网络编程:IP地址类、DatagramSocket(UDP)、DatagramPacket
- bash学习:变量键盘读取、数组与声明:read、array、declare
- linux stop.sh
- HDU 6038 Function
- select2设置默认值