单链表--uva 11988 Broken Keyboard 从入门到放弃

来源:互联网 发布:程序怎样烧进单片机 编辑:程序博客网 时间:2024/05/22 04:25

分析:

/*思路:用s数组存储字符串;用光标指定元素位置,下一个元素插入时在光标位置后面;用next数组记录指向的下一个元素,在数组上构建链表关系;将光标在字符串中移动,模拟输出结果构建链表关系,最后根据链表将数据输出。注意:链表一般有个头节点,可以将s[0]空出来对应头节点。*/
代码:

#include <cstdio>#include <cstdlib>#include <iostream>#include <stack>#include <queue>#include <algorithm>#include <cstring>#include <string>#include <cmath>#include <vector>#include <bitset>#include <list>#include <sstream>#include <set>#include <functional>using namespace std;#define INF 0x3f3f3f3fconst int maxn = 1e5+5;char s[maxn];int Next[maxn];int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifwhile(scanf("%s",s+1) != EOF) {int cur = 0,last = 0;Next[0] = -1;//尾节点的next默认值,可以写成-1,0,指针的话用的是null    int n = strlen(s+1);    for (int i = 1; i <= n; ++i){    if(s[i] == '[') cur = 0;    else if(s[i] == ']') cur = last;    else{//根据光标位置插入元素    Next[i] = Next[cur];//插入时元素连接光标元素后的链接    Next[cur] = i;//光标元素连接插入元素    if(cur == last) last = i;//正常插入时cur,last相等,插入后右移    cur = i;//光标右移,更新位置    }    }    for (int i = Next[0]; i != -1; i = Next[i]) printf("%c",s[i]);    printf("\n");}}

参考:算法竞赛入门经典(刘大爷)第六章

ps:刘大爷的代码真简洁,果然你大爷还是你大爷。



原创粉丝点击