题解:P12281 [蓝桥杯 2024 国 Python A/Java A] 记事本
思路
模拟方式
模拟罢了,但是如何实现光标?考虑使用两个栈
操作判断
这里反而是最简单的。
光标移动的判断
判断读入的字符串第一位是不是数字即可,至于往左和往右看最后一位。
获取
int t=0;
for(int i=0;i<s.size()-1;i++) t=t*10+(s[i]-'0');
在移动过程中,每移动一位就要将对应方向的栈顶字符插入到另一个栈中(如下图)。
if(s[s.size()-1]=='h'){
while(t--&&!a.empty()){
b.push(a.top());
a.pop();
}
}
else{
while(t--&&!b.empty()){
a.push(b.top());
b.pop();
}
}
删除字符的判断
看第一位和最后一位,大同小异,只是获取
if(s[s.size()-1]=='h') while(t--&&!a.empty()) a.pop();
else while(t--&&!b.empty()) b.pop();
插入字符串
由于插入字符串是统一在光标左侧,所以只需要插入在
for(int i=8;i<s.size()-1;i++) a.push(s[i]);
输出
现将
代码
#include<iostream>
#include<stack>
using namespace std;
stack<char>a,b;
int main()
{
int T;
cin>>T;
string s;
getline(cin,s);
while(T--){
getline(cin,s);
if(s[0]>='0'&&s[0]<='9'){
int t=0;
for(int i=0;i<s.size()-1;i++) t=t*10+(s[i]-'0');
if(s[s.size()-1]=='h'){
while(t--&&!a.empty()){
b.push(a.top());
a.pop();
}
}
else{
while(t--&&!b.empty()){
a.push(b.top());
b.pop();
}
}
}
else if(s[0]=='d'){
int t=0;
for(int i=1;i<s.size()-1;i++) t=t*10+(s[i]-'0');
if(s[s.size()-1]=='h') while(t--&&!a.empty()) a.pop();
else while(t--&&!b.empty()) b.pop();
}
else{
for(int i=8;i<s.size()-1;i++) a.push(s[i]);
}
}
while(!a.empty()){
b.push(a.top());
a.pop();
}
while(!b.empty()){
cout<<b.top();
b.pop();
}
return 0;
}