打字机修复 - 从损坏输出还原正常文本
打字机修复 - 从损坏输出还原正常文本
小C有一台打字机,使用打字机打字时,每在键盘上按一个字母键,屏幕中光标后的位置就会出现对应的字母,光标也会后移一位,一开始只有一个光标,没有字母。除此以外,打字机还有三个按键,分别是光标左移、光标右移以及删除按键(功能为删除光标前的字符,并将光标左移一位)。如果光标已经位于最左侧,则按下光标左移或删除按键时没有反应。如果光标已经位于最右侧,则按下光标右移时没有反应。
例如,如果小C依次按下 'a'、'b'、光标向左、'c',则屏幕上会显示 'acb' ,此时光标位于 'c' 、'b' 之间。 在此基础上,如果小C继续按下删除按键、'd',则屏幕上会显示 'adb' ,此时光标位于 'd' 后面。
但是有一天,他的打字机坏了:
- 按下字母键时,反应和之前一样。
- 按下光标左移时,光标并不会左移,而是会在屏幕上输出一个 '['。
- 按下光标右移时,光标并不会右移,而是会在屏幕上输出一个 ']'。
- 按下删除按键时,并不会删光标左侧的字母并将光标左移一位,而是会在屏幕上输出一个 '}'。
例如,对于之前给出的例子,坏了以后的打字机将显示 'ab[c}d' ,此时光标位于 'd' 后面。
现在,给出小C按下一些按键之后坏掉的打字机输出的内容,请你输出打字机没坏时小C依次按下相同的按键屏幕上会显示的内容。
输入格式
从标准输入读入数据。 输入一行,为一个长度不超过 $10^6$ 的字符串,包含大小写字母以及 '[' 、']' 、'}'。
输出格式
输出到标准输出。 输出一行,为打字机没坏时,小C依次按下相同的按键屏幕上会显示的内容。
样例 #1
样例输入 #1
ab[c}d
样例输出 #1
adb
代码实现
#include <iostream>
#include <stack>
#include <string>
using namespace std;
string repairTypewriter(string s) {
stack<char> st;
string result = "";
for (char c : s) {
if (c == '[') {
if (!st.empty()) {
result += st.top();
st.pop();
}
} else if (c == ']') {
if (!st.empty()) {
st.pop();
}
} else if (c == '}') {
if (!st.empty()) {
result += st.top();
st.pop();
}
result += '}';
} else {
st.push(c);
result += c;
}
}
return result;
}
int main() {
string s;
cin >> s;
string result = repairTypewriter(s);
cout << result << endl;
return 0;
}
原文地址: https://www.cveoy.top/t/topic/qCAA 著作权归作者所有。请勿转载和采集!