数组模拟单向链表例题(UVa11988)
指针的链表实现方式是,当前节点的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)的更多相关文章
- 数组模拟双链表,你get到了吗?
数组模拟双链表 通过前面的学习我们知道单链表是单个指针指向操作,那么通过类比我们可以把指针设定为两个,并且让它们分别指向前后数据,这就是"双向链表".使用这种链表,不仅可以从前往后 ...
- Problem UVA12657-Boxes in a Line(数组模拟双链表)
Problem UVA12657-Boxes in a Line Accept: 725 Submit: 9255 Time Limit: 1000 mSec Problem Description ...
- UVa 12657 Boxes in a Line(数组模拟双链表)
题目链接 /* 问题 将一排盒子经过一系列的操作后,计算并输出奇数位置上的盒子标号之和 解题思路 由于数据范围很大,直接数组模拟会超时,所以采用数组模拟的链表,left[i]和right[i]分别表示 ...
- 【数组模拟的链表or复杂模拟】PAT-L2-002. 链表去重
L2-002. 链表去重 给定一个带整数键值的单链表L,本题要求你编写程序,删除那些键值的绝对值有重复的结点.即对任意键值K,只有键值或其绝对值等于K的第一个结点可以被保留.同时,所有被删除的结点必须 ...
- Python手写模拟单向链表对象,栈对象和树
单向链表: class error(Exception): def __init__(self,msg): super(error,self).__init__() self.msg=msg def ...
- python算法双指针问题:使用列表和数组模拟单链表
这个很多基础算法,python已内部实现了. 所以,要想自己实现链表这些功能时, 反而需要自己来构造链表的数据结构. 当然,这是python灵活之处, 也是python性能表达不如意的来源. valu ...
- PHP算法学习(6) 单向链表 实现栈
svn地址:svn://gitee.com/zxadmin/live_z 这个是模拟栈的先进后出的一个链表操作,自动维护链表,当然你也使用SPL的栈 测试版本php 5.4 ,5.6,7.0,7.2 ...
- 数组、单链表和双链表介绍 以及 双向链表的C/C++/Java实现
概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...
- 待字闺中之快排单向链表;leetcode之Sort List
题目来源.待字闺中.原创@陈利人 .欢迎大家继续关注微信公众账号"待字闺中" 分析:思路和数据的高速排序一样,都须要找到一个pivot元素.或者节点. 然后将数组或者单向链表划分为 ...
随机推荐
- meshconverters
https://github.com/RobotLocomotion/meshConverters meshconverters $ mkdir build && cd build $ ...
- 1.spring.net Look-up Method 查找方法的注入(方法是抽象的需要spring.net注入)
.为什么需要查找方法的注入 当Object依赖另一个生命周期不同的Object,尤其是当singleton依赖一个non-singleton时,常会遇到不少问题,Lookup Method Injec ...
- Android Touch 事件总结
---恢复内容开始--- 1.Touch事件传递机制 过程有点儿类似于栈, ViewGroup的子类有都继承它的以下3个方法: public boolean dispatchTouchEvent(Mo ...
- 编写高质量代码改善C#程序的157个建议——建议132:考虑用类名作为属性名
建议132:考虑用类名作为属性名 一般来说,若果属性对应一个类型,应该直接用类型名命名属性名.如下: class Person { public Company Company { get; set; ...
- unittest测试框架详谈及实操(五)
测试报告——生成HTML格式的测试报告 前面的实例输出的所有测试结果都是以命令行日志的方式展示,不止于难看,但也不适合直接把那样的测试结果截图发给相关人员,尤其是领导.这时需要更加友好的测试结果,既能 ...
- Alpha冲刺(九)
Information: 队名:彳艮彳亍团队 组长博客:戳我进入 作业博客:班级博客本次作业的链接 Details: 组员1(组长)柯奇豪 过去两天完成了哪些任务 进一步优化代码,结合自己负责的部分修 ...
- centos 7防火情配置
查看版本 firewall-cmd --version 2 查看指定端口是否开放 firewall-cmd --query-port=端口号/tcp 3 开放指定端口(--permanent表示永久, ...
- C++语言运算符的功能、优先级和结合性
优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式)/函数名(形参表) . 成员选择(对象) 对象.成员名 -& ...
- opencv——播放视频
#include "stdafx.h" #include <opencv2\opencv.hpp> #include <iostream> #include ...
- Spring事务管理—aop:pointcut expression 常见切入点表达式及事物说明
例: <aop:config> <aop:pointcut expression="execution(* com.xy.service.*.*(..))" ...