uva 11988

原题

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

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

这里顺便复习一下 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值