紫书章六例题四 悲剧文本 UVA 11988 (用数组模拟单向链表递归)

    xiaoxiao2021-04-14  58

    题意:输入一串文本,遇到[]就将里面的内容就放到最前面 然后 有两种做法,第一种,用链表来做(用数组模拟)

    #include <iostream> #include <algorithm> #include <cmath> #include <cstring> #include <cstdio> #include <queue> using namespace std; const int maxn= 100006; char s[maxn]; int next1[maxn]; int main() { while(scanf("%s",s+1)!=EOF) { memset(next1,0,sizeof(next1));//next数组中放的是右边的下标 int len = strlen (s+1); int cur=0,last=0; for(int i=1;i<=len;i++) { if(s[i]=='[') cur=0;//放到最前面 else if(s[i]==']') cur=last;//回归正常 else { next1[i]=next1[cur];//先i的右边等于 cur的右边 next1[cur]=i;//cur 等于 i (相当于将cur与之前的联系去掉了) if(last==cur) last=i;//紧跟 cur=i; } } for(int i=next1[0];i;i=next1[i]) printf("%c",s[i]); printf("\n"); } return 0; }

    第二种用递归来

    #include <iostream> #include <cstring> #include <algorithm> #include <cstdio> using namespace std; string str; void dfs(int l,int r) { int slen=r; while(slen>=l&&str[slen]!='['&&str[slen]!=']') slen--;//从后往前扫,因为最后的[]在最前面,也就是最先输出 if(str[slen]==']') dfs(l,slen-1); for(int i=slen+1;i<=r;i++) printf("%c",str[i]); if(str[slen]=='[') dfs(l,slen-1); } int main() { while(getline(cin,str)){ // cout<<str<<endl; dfs(0,str.length()-1); printf("\n"); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-670268.html

    最新回复(0)