还原键盘输入

任务描述

本关任务:编写一个能根据键盘操作记录还原实际输入的小程序。

相关知识

本关涉及到的内容如下:

  • list容器的使用
list容器的使用

list位于头文件<list>,是 STL 提供的一种顺序存储的容器,它不支持通过位置索引访问,但能高效的进行插入、删除元素操作,通常由双向链表实现。

list是一个模板类,使用时需要指定模板参数,而且作为参数的类型需要有无参数的构造函数(如果不使用Allocator)。

它常用的构造函数如下:

 
  1. list<int> l(); //无参构造函数
  2. list<int> l2(10); //包含10个默认值0元素
  3. list<int> l3(10,123); //包含10个123元素

它的beginend函数用于获取指向第一个元素的迭代器和指向最后一个元素之后的迭代器。

如果要修改容器内容,可以使用以下函数:

 
  1. list<int> l;
  2. l.push_back(1); //添加到链尾
  3. l.push_front(2); //添加到链头
  4. l.pop_back(); //删除链尾元素
  5. l.pop_front(); //删除链头元素
  6. l.insert(l.begin(),3); //在指定迭代器之前添加一个元素
  7. l.erase(l.begin()); //删除指定迭代器所指的元素

list的迭代器有一点特别,当对容器进行修改时,只要不是删除了这个迭代器对应的元素,这个迭代器都不会失效。 比如:

 
  1. list<int> l;
  2. list<int>::iterator it = l.begin();
  3. l.insert(it,10); //执行之后it依然有效,并且现在it不再与l.begin()相等
  4. l.erase(it-1); //执行之后it依然有效
  5. l.erase(it); //现在it无效了

如果要查询list的元素数量,可以使用以下函数:

 
  1. int size = l.size(); //返回元素个数
  2. bool isem = l.empty(); //容器为空时返回true

list的成员函数不仅仅只有这些,感兴趣的同学可以查阅其他资料进行学习。

编程要求

学员需要读取输入的键盘操作记录,并根据操作记录还原最后的输入结果。

每一次的操作记录为一行字符串,字符串的内容分为以下几类:

  • 大小写字母,数字:代表用户在输入光标左侧输入了一个具体字符,光标保持在新输入字符的Begin-End区域内
  • <>字符:代表用户按下了左键或者右键,作用是输入光标向左或者向右移动一个位置。
  • []字符:代表用户按下了Home或者End,作用是移动输入光标到最开始或者最末尾的位置。

每一次操作记录开始的时候都是没有输入的。

注意:输入光标只能在已输入内容两端内部移动。

输入将会有多行,每一行代表一次操作记录,每次操作记录产生一行结果,具体见测试说明

测试说明

测试输入: aa a<b

预期输出: aa ba

测试输入: a<ba[c aa<<b]c

预期输出: cbaa baac


#include <iostream>
#include <string>
#include <list>
using namespace std;

int main()
{
    list<char> l;
    list<char>::iterator it=l.begin();
    char to; 
    while(1){
		if((to=getchar())==EOF){
			for(list<char>::iterator i=l.begin();i!=l.end();i++)
        		cout<<*i;
        	cout<<'\n';
        	l.clear();
			it=l.begin();
        	break;
		}
        switch(to){
        	case '<':
        		if(it!=l.begin())
        		it--;
        		break;
        	case '>':
        		if(it!=l.end())
        		it++;
        		break;
        	case '[':
        		it=l.begin();
        		break;
        	case ']':
        		it=l.end();
        		break;
        	case '\n':
        		for(list<char>::iterator i=l.begin();i!=l.end();i++)
        			cout<<*i;
        		cout<<'\n';
        		l.clear();
				it=l.begin();
        		break;
        	default:
        		l.insert(it,to);
        		break;
		}
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式Dora

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值