http://acm.sgu.ru/problem.php?contest=0&problem=397

模拟编辑器的操作,给出一个字符串,字符如果是'L'代表光标向左移动,'R'代表向右移动,如果到了最左或最右则不再移动,如果是其他字符则直接在光标处插入。
用链表处理就比较好了。因为如果用数组或连续分配的内存的话那么每次在中间或开头插入都要将后面的字符向右移动,操作起来会比较慢。文本编辑器的实现一般也是用类似链表的这种结构。

#include <cstdio>
#include 
<cstring>
#include 
<list>

using namespace std;

char org[1000001];

int main(void) {
    list
<char> word;
    scanf (
"%s", org);
    
int i;
    
int len = strlen(org);
    list
<char>::iterator it = word.begin();
    
for (i = 0; i < len; ++i) {
        
if (org[i] == 'L') {
            
if (it != word.begin()) {
                
--it;
            }
        } 
else if (org[i] == 'R') {
            
if (it != word.end()) {
                
++it;
            }
        } 
else {
            word.insert(it, org[i]);
        }
    }
    
for (it = word.begin(); it != word.end(); ++it) {
        printf (
"%c"*it);
    }
    printf (
"\n");
    
return 0;
}

posted on 2010-05-16 14:52 Willing 阅读(412) 评论(0)  编辑 收藏 引用 所属分类: ACM

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理