uva 11988

来源:互联网 发布:淘宝开店还要考试吗 编辑:程序博客网 时间:2024/04/30 17:15

原题

挺有意思的一道题, 模拟输入, 用链表+迭代器操作非常方便

一个一个字符地读进来, 读到 [ 就把迭代器指向表头, 读到 ] 就把迭代器指向表尾

这里顺便复习一下 list 的迭代器插入规则 : 首先在iter处插入, 指的是从iter指向的元素的前面插入

其次, 用迭代器插入一个字符后, 原迭代器仍然指向原来的字符(与连续存储的vector不同)

即如果 iter 指向 list 的超尾元素( list.end() ), 执行语句 list.insert( iter,ch) 在list.end()前一个位置, 

也就是把ch放在list的尾部之后, iter还是指向list.end()的, 

这样就可以不断循环执行  list.insert( iter,ch)  来插入一个连续的字符串

同样, 若iter原来指向list.begin(), 在iter 插入字符后, list.begin() 变成了新插入的字符, 但是iter不变, 所以iter就指向了list的第二个字符

这样也不用改变 iter, 就可以连续地在list的头部正序插入一个字符串了

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#include <string>#include <vector>#include <set>#include <stack>#include <queue>#include <deque>#include <map>#include <list>#include <cassert>#include <iomanip>using namespace std;const int MAXN = 100000;const int BASE = 100000000;typedef long long LL;/*uva 11988*/list<char> str;int main(){char ch; while( scanf("%c",&ch)!=EOF ){str.clear();list<char>::iterator it= str.begin();ungetc(ch,stdin);while( (ch=getchar())!='\n' ){if( ch=='[' ){it = str.begin();}else if( ch==']' ){it = str.end();}else{//cout << "(" << *it << ")" << endl; str.insert(it,ch);//cout << "(" << *it << ")" << endl;}}list<char>::iterator it2 = str.begin();while( it2!=str.end() ){cout << *it2;it2++; }cout << endl;}return 0;}


0 0