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;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章