关于UVa11988的两种写法
本题是刘汝佳紫书上的一道例题而已,书上给出的是数组模拟链表的写法。具体方法是,先用cur去记录当前的光标位置,然后如果没有遇到"["或者"]"就更新链表中的元素,如果遇到了"["就跳转至光标0处进行处理。如果遇到了"]"就跳转至cur2,即遇到"["之前的光标位置然后继续处理。更新链表就是让当前字符指向的下一个为0,意思是下一个为空(在当前状态暂且这么认为),然后上一个元素指向当前元素。然后输出就按照链表数组记录的顺序输出即可。
代码如下:
- #include<iostream>
- #include<string.h>
- #include<stdio.h>
- using namespace std;
- char s[100005];
- int cur = 0;
- int next1[100005];
- int cur2;
- int main()
- { while(scanf("%s",s+1) == 1)
- {
- int len = strlen(s+1);
- next1[0] = 0;
- cur = cur2 = 0 ;
- for(int i = 1; i<= len ;i++)
- {
- if(s[i]!='['&&s[i]!=']')
- {
- next1[i] = next1[cur];
- next1[cur] = i;
- if(cur == cur2)
- cur2 = i;
- cur = i;
- }
- else if(s[i]=='[')
- {
- cur = 0;
- }
- else if(s[i]==']')
- { cur = cur2;
- }
- }
- for(int i = next1[0];i!=0; i = next1[i])
- printf("%c",s[i]);
- printf("\n");
- }
- return 0;
- }
但是,上课的时候老师讲了另外一种方法,那就是用双向数组deque去做。
方法是,用一个字符串tmp去存储字符,如果遇到的字符不是"["或者"]",那就塞入tmp中,如果遇到了"[",那就把tmp从首端塞入deque再清空tmp,如果是遇到"]"就从尾部塞入deque再清空tmp。如果是最后一个字符的话,那就同样分情况。"["就从首端塞入,其他的就尾端塞入。
代码如下:
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<deque>
- using namespace std;
- deque<string> dq;
- string tmp,s;
- int main()
- { while(cin >>s)
- { tmp.clear();
- char op =0;
- for(int i = 0;i<s.size();i++)
- {
- if(s[i]=='['||s[i]==']')
- {if(op=='[')
- dq.push_front(tmp);
- else
- dq.push_back(tmp);
- tmp.clear();
- op =s[i];
- }
- else
- tmp+=s[i];
- if(i==s.size()-1)
- {
- if(op=='[')
- dq.push_front(tmp);
- else
- dq.push_back(tmp);
- tmp.clear();
- }
- }
- while(!dq.empty())
- {
- printf("%s",dq.front().c_str());
- dq.pop_front();
- }
- puts("");
- }
- return 0;
- }
两种方法还是有区别的,模拟链表只能一个字符一个字符地输出,而deque是一段一段输出。且处理方式也是不同的,前者是按照链表顺序输出,后者是利用一个tmp字符串去模拟缓冲区,然后再根据"["和"]"去模拟输出位置。

浙公网安备 33010602011771号