zoukankan      html  css  js  c++  java
  • 例题6-4 破损的键盘(又名:悲剧文本)(Broken Keyboard,UVa 11988)—静态链表

    问题描述:

           你有一个破损的键盘。键盘上所有的键都可以正常工作,但有时候Home键或者End键会自动按下。你并不知道键盘存在这一问题,而是专心打稿子,甚至连显示器都没打开。当你打开显示器后,展现在你面前的是一段悲剧文本。你的任务是在打开显示器之前计算出这段悲剧文本。

           输入包含多组数据。每组数据占一行,包含不超过100000个字母、下划线、字符“【”或者“】”。其中字符“【”表示Home键,“】”表示End键。输入结束标志为文件结束符(EOF)。输入文件不超过5MB。对于每组数据,输出一行,即屏幕上的悲剧文本。

    样例输入:

    This_is_a_[Beiju]_text

    样例输出:

    BeijuThis_is_a_text

    【分析】

    1、因为若用数组来保存这段文档,则太费时间(每输入一个字符都需要把后面的字符全部右移,给新字符腾出位置)这样的代码会超时。

    2、所以决定采用静态链表来进行操作,(因为静态链表中有cur指向下一个元素,这样比较容易操作),为了方便起见,常常在链表的第一个元素之前放一个虚拟结点是s[0]。链表中插值时采用的尾插入法,比较方便。

    3、关于Home与End键     从本体的样例输出可以看出,本题是需要将[ ]中的内容提到文档的前面,因为Home表示首位置,End表示末位置 。所以代码核心就是当读到 [ 时,给cur赋值0,读到 ] 时,给cur赋值last,读到其他字符时,尾插入法插值,cur及last后移。 

    代码如下:

    #include <cstdio>
    #include <cstring>
    const int maxn=100000+5;
    int last,cur,next[maxn];
    char s[maxn];

    int main(){
     while(scanf("%s",s+1)){
      int n=strlen(s+1);//计算字符串s的长度,并赋值给n
      last=cur=0;
      next[0]=0;//建一个虚拟位置点
      
      
      for(int i=1;i<=n;i++){
       char ch=s[i];
       if(ch=='[')      cur=0;//因为‘【’代表的home键,所以当光标指向【时,cur指针应指向首位置
       else if(ch==']')  cur=last;//同上,因为】代表的end键,所以当光标指向】时,cur指针应指向末位置
       else{//当读入其他字符时,向静态链表中插值就好
        next[i]=next[cur];  next[cur]=i;//尾插入法
        if(cur==last)  last=i;  cur=i;//尾光标向后移动
       }
      }
      //顺次输出
      for(int i=next[0];i!=0;i=next[i])
          printf("%c",s[i]);
      printf(" ");
     }
     return 0;
    }

    运行结果:

    总结:

    1、在刚开始看到这道题的时候,因为不了解Home键和End键的具体功能,对代码中部的cur与last赋值不是很明白,在尝试之后,才理解为何Home给cur赋0,End给cur赋last;

    2、看到strlen函数的时候,不太明白他表示的意思,去百度时看见有的代码的注释写的为 初始化链表(更加懵逼脸),在仔细百度strlen后。。一个计算字符串长度的函数(不包括

    ‘')  用到此处的目的是为了要计算出 s链表中存储的字符串的长度,便于之后for循环时的需要

  • 相关阅读:
    precmd:6: job table full or recursion limit exceeded
    Logs
    vue路由的使用(二)
    vue路由的使用(一)
    vue项目中正确引用jquery
    vue中使用Mint-UI移动端组件库
    HTML5表单、一些新增的输入类型以及为不支持新特性的浏览器提供解决方案
    CSS3过渡、变形、动画(二)
    CSS3过渡、变形、动画(一)
    CSS3之背景渐变
  • 原文地址:https://www.cnblogs.com/zx-zhang/p/7719944.html
Copyright © 2011-2022 走看看