关于UVa11988的两种写法

本题是刘汝佳紫书上的一道例题而已,书上给出的是数组模拟链表的写法。具体方法是,先用cur去记录当前的光标位置,然后如果没有遇到"["或者"]"就更新链表中的元素,如果遇到了"["就跳转至光标0处进行处理。如果遇到了"]"就跳转至cur2,即遇到"["之前的光标位置然后继续处理。更新链表就是让当前字符指向的下一个为0,意思是下一个为空(在当前状态暂且这么认为),然后上一个元素指向当前元素。然后输出就按照链表数组记录的顺序输出即可。

代码如下:

  1.    #include<iostream>  
  2. #include<string.h>  
  3. #include<stdio.h>  
  4. using namespace std;  
  5. char s[100005];  
  6. int cur = 0;  
  7. int next1[100005];  
  8. int cur2;  
  9. int main()  
  10. {  while(scanf("%s",s+1) == 1)  
  11.   {  
  12.      int len = strlen(s+1);  
  13.      next1[0] = 0;  
  14.      cur = cur2 = 0 ;   
  15.        for(int i  = 1; i<= len ;i++)  
  16.      {       
  17.         if(s[i]!='['&&s[i]!=']')  
  18.         {  
  19.             next1[i] = next1[cur];  
  20.             next1[cur] = i;  
  21.             if(cur == cur2)  
  22.             cur2 = i;  
  23.             cur = i;              
  24.           }  
  25.         else if(s[i]=='[')  
  26.         {    
  27.            cur = 0;  
  28.                       
  29.         }  
  30.         else if(s[i]==']')  
  31.         {   cur  = cur2;  
  32.         }  
  33.        }  
  34.         for(int i = next1[0];i!=0; i = next1[i])  
  35.        printf("%c",s[i]);  
  36.        printf("\n");  
  37.   }  
  38.     return 0;  
  39. }   

但是,上课的时候老师讲了另外一种方法,那就是用双向数组deque去做。

方法是,用一个字符串tmp去存储字符,如果遇到的字符不是"["或者"]",那就塞入tmp中,如果遇到了"[",那就把tmp从首端塞入deque再清空tmp,如果是遇到"]"就从尾部塞入deque再清空tmp。如果是最后一个字符的话,那就同样分情况。"["就从首端塞入,其他的就尾端塞入。

代码如下:

  1. #include<iostream>  
  2. #include<cstdio>  
  3. #include<algorithm>  
  4. #include<cstring>  
  5. #include<deque>  
  6. using namespace std;  
  7. deque<string> dq;  
  8. string tmp,s;  
  9. int main()  
  10. {  while(cin >>s)  
  11. {  tmp.clear();  
  12.    char op =0;    
  13.   for(int i = 0;i<s.size();i++)  
  14.   {  
  15.   if(s[i]=='['||s[i]==']')  
  16.    {if(op=='[')  
  17.     dq.push_front(tmp);  
  18.     else  
  19.     dq.push_back(tmp);  
  20.         tmp.clear();  
  21.          op =s[i];    
  22.    }  
  23.    else  
  24.      tmp+=s[i];  
  25.          
  26.   if(i==s.size()-1)  
  27.   {  
  28.     if(op=='[')  
  29.     dq.push_front(tmp);  
  30.     else   
  31.     dq.push_back(tmp);   
  32.         tmp.clear();  
  33.   }  
  34. }  
  35. while(!dq.empty())  
  36. {  
  37.     printf("%s",dq.front().c_str());  
  38.     dq.pop_front();  
  39. }  
  40. puts("");  
  41. }  
  42.           
  43.       
  44.     return 0;  
  45. }   

两种方法还是有区别的,模拟链表只能一个字符一个字符地输出,而deque是一段一段输出。且处理方式也是不同的,前者是按照链表顺序输出,后者是利用一个tmp字符串去模拟缓冲区,然后再根据"["和"]"去模拟输出位置。

   

   

  

posted @ 2021-01-25 21:36  This_is_hop  阅读(167)  评论(0)    收藏  举报