UVa 11988 - Broken Keyboard (a.k.a. Beiju Text)

解题思路:
我觉得这道题最简单的方法就是用STL里面的list直接模拟,遇到字符[就把插入位置定位在头部,遇到字符]就把插入位置定位在尾部,遇到正常字符根据目前的插入位置插入即可,最终得到的list即为所求文本内容。
方法二:当然也可以用双向队列进行模拟,但是因为队列的特点,每次插入的时候不能以一个单个的字符为单位进行插入,而应该在每次遇到[或]字符之前将之前的字符连成一个字符串,在遇到[或]的时候将此字符串入队列,同时将之前记录字符串的变量清空,至于在哪头入队列,我们应该设置两个标志性的布尔变量front和rear,若front=true则在头部入,若rear=true则在尾部入,当然这样的话我们在遇到[或]时也应该修改他们的值,标志着下一次的字符串插入的位置。

贴代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define eps 1e-8
#define INF 0x7fffffff
#define PI acos(-1.0)
#define seed 31//131,1313
#define MAXV 50010
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
typedef long long LL;
typedef unsigned long long ULL;
using namespace std;
/////////////////////////
//方法一用STL中的双向队列
const int MAXN = 100010;
char str[MAXN];
deque<string>dqe;
void Myinsert(bool front , bool rear , string s){
    if(front)
        dqe.push_front(s);
    if(rear)
        dqe.push_back(s);
}

void output(){
    while(!dqe.empty()){
         cout<puts("");
}

void solve(){
    int len = strlen(str);
    bool front , rear;
    string s = "";
    front = true;
    rear = false;
    for(int i = 0 ; i < len ; i++){
        if(str[i] == '['){
           Myinsert(front , rear , s);
           s = "";
           front = true;
           rear = false;
        }
        else if(str[i] == ']'){
           Myinsert(front , rear , s);
           s = "";
           front = false;
           rear = true;
        }
        else{
           s += str[i];
        }
    }
    Myinsert(front , rear , s);
    output();
}
int main(){
    while(scanf("%s" , str) != EOF)
        solve();
    return 0;
}

//////////////////////
//方法二:用list
//#include
//#include
//#include
//#include
//#include
//using namespace std;
//listMylist;
//const int MAXN = 100010;
//int main()
//{
//    char s[MAXN];
//    while(gets(s)){
//        Mylist.clear();
//        list::iterator it=Mylist.begin();
//        int len = strlen(s);
//        for(int i=0;i
//          if(s[i]=='['){
//            it=Mylist.begin();
//          }
//          else if(s[i]==']'){
//            it=Mylist.end();
//          }
//          else{
//            Mylist.insert(it,s[i]);
//          }
//        }
//
//        for(it=Mylist.begin();it!=Mylist.end();it++){
//           printf("%c" , *it);
//        }
//        puts("");
//    }
//    return 0;
//}

你可能感兴趣的:(STL初步)