PTA 小明打字 (2024郑州大学C语言实验8)

题面

小明正使用Microsoft Word打一篇文档,文档只包含a-z的小写字母和空格,在打字过程中可能会一次或多次按下Home键、End键、←方向键、→方向键、Insert键、Backspace键。请编写程序,给定小明在键盘上按键的序列,输出小明屏幕上最终显示的文本。
提示:Home键会将当前光标移至文本开始位置,End键当前光标移至文本尾,←键和→键会使当前光标左移或右移一个位置(如果光标在文档头则无法左移,光标在文档尾则无法右移),Insert键会在插入和替换文本间切换(默认是插入状态),Backspace键会删除当前光标前的一个字符。

输入格式:

输入为不超过50000个字符,表示小明的按键序列。包含a-z的小写字母、空格以及字符[、]、{、}、-、=。其中字符“[”表示Home键,“]”表示End键,“{”表示←键,“}”表示→键,“-”表示Insert键,“=”表示Backspace键。

输出格式:

输出为在小明屏幕上最终显示的文本。最后一个字母后没有回车或换行。

输入样例1:

jilin[i lofe{{-v-} ] universiti=y

输出样例1:

i love jilin university

输入样例2:

abcd[c-de

输出样例2:

cdecd

输入样例3:

[[]][][]happy=birthday

输出样例3:

happbirthday

输入样例4:

efg[bbb}}=}}}}=[{{{{a

输出样例4:

abbbe

 分析

c链表可做,本蒻笱使用模拟双向链表的方法做了一下,不对之处敬请指正

代码


#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int idx;
int l[N], r[N];
char e[N];

void init()
{
    l[1] = 0, r[0] = 1;
    idx = 2;
}

//第k个点右边插入
void add(int k, char x)
{
    e[idx] = x;
    l[idx] = k;
    r[idx] =  r[k];
    l[r[k]] = idx;
    r[k] = idx;
    idx++;
}

//删除第k个点
void remove(int k)
{
    r[l[k]] = r[k];
    l[r[k]] = l[k];
}

int main()
{
    init();
    string s;
    getline(cin, s);

    int j = 0;
    int state = 0;
    for(int i = 0; i < s.size(); i++)
    {
        if((s[i] >= 'a' && s[i] <= 'z') || s[i] == ' ')
        {
            if(state % 2 == 1 && r[j] != 1) remove(r[j]);
            add(j, s[i]);
            j = idx - 1;
        }
        else if(s[i] == '[')
        {
            j = 0;
        }
        else if(s[i] == ']')
        {
            j = l[1];
        }
        else if(s[i] == '{')
        {
            if(j != 0) j = l[j];
        }
        else if(s[i] == '}')
        {
            if(r[j] != 1) j = r[j];
        }
        else if(s[i] == '-')
        {
            state++;
        }
        else if(s[i] == '=')
        {
            if(j != 0) remove(j), j = l[j];
        }
    }

    for(int i = r[0]; i != 1; i = r[i])
    {
        cout<<e[i];
    }

    return 0;
}

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值