UVa 11988 Broken Keyboard (a.k.a. Beiju Text)——字符串

这题是我最喜欢的字符串处理。。。。。

题目大意是给你一个字符串,字符串是模拟键盘的记录的,其中[代表Home键,]代表End键。 求这样按下键盘后的屏幕输出。

按照题目要求模拟一下即可。

本题最直接的思路就是模拟一下这个过程,但是这需要在一串字符之前加上另一个串,所以这里用了双向队列。

双向队列是可以在前边和后边插入元素的数据结构。在这里,双向队列仅仅记录一下字符串的“指针”(←,就是下标),而不真正的移动字符串,等到要输出的时候,按照指针顺序输出字符串。

AC代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream> 
#include <deque>
using namespace std;
int main(int agrc, char *agrv[]) {
string str;
while(getline(cin, str)) {
deque<int> output;

//记录起点
output.push_back(0);
for(int i=0; i < str.length(); i++)
//在检测到按下Home后,把当前指针记录在双向队列前端。
if(str[i] == '[') output.push_front(i + 1);
//在检测到按下End后,把当前指针记录在双向队列末端。
else if(str[i] == ']') output.push_back(i + 1);
//按照双向队列中记载的输出顺序分段输出。
for(deque<int>::iterator it = output.begin(); it != output.end(); it++)
for(int i = (*it); str[i] && str[i] != '[' && str[i] != ']'; i++) cout.put(str[i]);
cout<<endl;
}
}