指针的链表实现方式是,当前节点的next指向下一个节点,用数组模拟就是 for(int i=next[0];i!=0;i=next[i]) i=next[i];就是一条链。

例题:

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

输入包含多组数据。每组数据占一行,包含不超过100000个字母,下划线,字符"["或者"]"。其中"["表示HOME,"]"表示END键。输入结束标志为文件结束符(EOF)。

#include <cstdio>
#include <cstring> const int maxn=+;
int last,cur,next[maxn];
char s[maxn]; int main() {
while(scanf("%s",s+)==) {
int n=strlen(s+);
last=cur=;
next[]=; for(int i=;i<=n;i++) {
char ch=s[i];
if(ch=='[') cur=;
if(ch==']') cur=last;
else {
next[i]=next[cur];
next[cur]=i;
if(cur==last) last=i;
cur=i;
}
}
for(int i=next[];i!=;i=next[i])
printf("%c",s[i]);
printf("\n");
}
return ;
}

cur代表当前字符的位置,也就是说它在光标的左边,i代表下一个字符  next[i]=next[cur];是把下一个字符的位置赋值为0,next[cur]=i;是把cur与i链接起来,cur->i; 在没有"["或者"]"出现的时候,last在cur的前面,也就是当前字符的前面,所以当 s[i]是"["是,last保存着它前一个字符的位置,当出现"]"时,last=cur又让cur回到了那个位置,然后cur又与i链接。

以这个输入为例。

ABC[DE]F

首先在ABC的时候,是按顺序链接的 0->1->2->3 当遇到'['时,cur=0;所以 next[5]=next[0]; next[0]=5;这样  顺序就变成了 0->5->1->2->3; 然后到E这个字符,同样 next[6]=next[5];next[5]=6; 这样 顺序变成了 0->5->6->1->2->3; 然后到']' 这时候 cur=last=3; 然后到了F; next[9]=next[3]; next[3]=9; 这样 最后的顺序为 0->5->6->1->2->3->9; 这也是最后的打印顺序,注意 开头的0只是个开始,对应指针表示里的头指针,它本身不代表任何字符 因为s[0]不代表字符,s是从1开始的有字符。当然,与链表一样 这个0可以有,没有也行,如果不从0开头 就需要设next[1]=0;然后,最后单独打印s[1];

核心就是 next[i]=next[cur]相当于指针创建中的 p->next=*L->next;(一个是让next[i]=0,一个是让p->next=NULL) next[cur]=i 相当于指针创建中的 *L->next=p;(一个让cur->i 一个让L的next->p)

数组模拟单向链表例题(UVa11988)的更多相关文章

  1. 数组模拟双链表,你get到了吗?

    数组模拟双链表 通过前面的学习我们知道单链表是单个指针指向操作,那么通过类比我们可以把指针设定为两个,并且让它们分别指向前后数据,这就是"双向链表".使用这种链表,不仅可以从前往后 ...

  2. Problem UVA12657-Boxes in a Line(数组模拟双链表)

    Problem UVA12657-Boxes in a Line Accept: 725  Submit: 9255 Time Limit: 1000 mSec Problem Description ...

  3. UVa 12657 Boxes in a Line(数组模拟双链表)

    题目链接 /* 问题 将一排盒子经过一系列的操作后,计算并输出奇数位置上的盒子标号之和 解题思路 由于数据范围很大,直接数组模拟会超时,所以采用数组模拟的链表,left[i]和right[i]分别表示 ...

  4. 【数组模拟的链表or复杂模拟】PAT-L2-002. 链表去重

    L2-002. 链表去重 给定一个带整数键值的单链表L,本题要求你编写程序,删除那些键值的绝对值有重复的结点.即对任意键值K,只有键值或其绝对值等于K的第一个结点可以被保留.同时,所有被删除的结点必须 ...

  5. Python手写模拟单向链表对象,栈对象和树

    单向链表: class error(Exception): def __init__(self,msg): super(error,self).__init__() self.msg=msg def ...

  6. python算法双指针问题:使用列表和数组模拟单链表

    这个很多基础算法,python已内部实现了. 所以,要想自己实现链表这些功能时, 反而需要自己来构造链表的数据结构. 当然,这是python灵活之处, 也是python性能表达不如意的来源. valu ...

  7. PHP算法学习(6) 单向链表 实现栈

    svn地址:svn://gitee.com/zxadmin/live_z 这个是模拟栈的先进后出的一个链表操作,自动维护链表,当然你也使用SPL的栈 测试版本php 5.4 ,5.6,7.0,7.2 ...

  8. 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

  9. 待字闺中之快排单向链表;leetcode之Sort List

    题目来源.待字闺中.原创@陈利人 .欢迎大家继续关注微信公众账号"待字闺中" 分析:思路和数据的高速排序一样,都须要找到一个pivot元素.或者节点. 然后将数组或者单向链表划分为 ...

随机推荐

  1. ThinkPhp数据缓存技术

    1.缓存初始化 在 ThinkPHP 中,有一个专门处理缓存的类:Cache.class.php(在Thinkphp/Library/Think/cache.class.php,其他的各种缓存类也在这 ...

  2. 关于innerHTML以及html2dom

    使用innerHTML或者insertAdjacentHTML 创建元素的时候能给我们带来很大的方便,为domNode 赋予innerHTML 属性,在插入大量的HTML的时候,使用innerHTML ...

  3. C# 单例模式(Singleton)

    摘要 在我们日常的工作中经常需要在应用程序中保持一个唯一的实例,如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就是我们今天要 ...

  4. 关于super关键字与继承

    super它只是一个限定词,当用super引用时,它也是引用当前对象本身,只是super只是限定了访问当前对象从父类那里继承得到成员变量或方法. import java.util.Date; publ ...

  5. Linux系统优化及状态监控

    1.查看系统进程命令 top 进入后可按s 加时间,指定多长时间刷新一次 2.查看cpu信息 cat /proc/cpuinfo 3.查看内存信息 cat /proc/meminfo 4.清理内存:主 ...

  6. 前台通过form表单向Django后台传输数据,Django处理后返回给前台

    摘要:Django前后台数据传递 通过action将数据传输给apitest这个地址,使用get方法传递,此处需要传递name="request_method"的下拉列表值和nam ...

  7. Spring Boot - Spring Scheduling

    有时应用需要定时(如凌晨)执行一些任务(比如计算一些数据并存下来留给后续使用) 使用 使用@EnableScheduling注解启用Scheduling功能:不一定要标注在启动类上,也可以标注在@Co ...

  8. 序列(DP)(组合数)

    这是一个DP题. 我们设\(f[i][j][k]\)表示\(i\)序列长度中放入了\(j\)个元素,其中\(k\)是限定的众数的个数:状态转移方程是 \[f[k][i][j]=f[k][i-1][j- ...

  9. Mysql数据类型《二》字符类型

    字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的参数指的都是字符的长度 #char类型:定 ...

  10. day02.5-集合内置方法

    集合——set的定义:test = {1,2,3,4,5} 或 test = frozenset(1,2,3,4,5) 特点:1. 集合是可变数据类型 2. 集合中元素是无序的,可以是数字.字符串与元 ...